diff options
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 & 0x7)" /> - <Intrinsic Name="opSize" Expression="(_signature >> 24) & 0xFF" /> - - <Intrinsic Name="regType" Expression="(_signature >> 3) & 0x1F" /> - <Intrinsic Name="regGroup" Expression="(_signature >> 8) & 0xF" /> - - <Intrinsic Name="memBaseType" Expression="(_signature >> 3) & 0x1F" /> - <Intrinsic Name="memIndexType" Expression="(_signature >> 8) & 0x1F" /> - <Intrinsic Name="memAddrType" Expression="(_signature >> 13) & 0x3" /> - <Intrinsic Name="memRegHome" Expression="(_signature >> 15) & 0x1" /> + <Type Name="asmjit::OperandSignature"> + <Intrinsic Name="opType" Expression="(asmjit::OperandType)(_bits & 0x7)" /> + <Intrinsic Name="opSize" Expression="(_bits >> 24) & 0xFF" /> + <Intrinsic Name="regType" Expression="(asmjit::RegType)((_bits >> 3) & 0x1F)" /> + <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_bits >> 8) & 0xF)" /> + <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_bits >> 3) & 0x1F)" /> + <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_bits >> 8) & 0x1F)" /> + <Intrinsic Name="memRegHome" Expression="(bool)((_bits >> 13) & 0x1)" /> + <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_bits >> 18) & 0x7)" /> + <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_bits >> 14) & 0x3)" /> + <Intrinsic Name="memX86ShiftValue" Expression="((_bits >> 16) & 0x3)" /> + <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_bits >> 21) & 0x7)" /> + <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_bits >> 3) & 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() > 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 & 0x7)" /> + <Intrinsic Name="opSize" Expression="(_signature._bits >> 24) & 0xFF" /> + <Intrinsic Name="regType" Expression="(asmjit::RegType)((_signature._bits >> 3) & 0x1F)" /> + <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_signature._bits >> 8) & 0xF)" /> + <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_signature._bits >> 3) & 0x1F)" /> + <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_signature._bits >> 8) & 0x1F)" /> + <Intrinsic Name="memRegHome" Expression="(bool)((_signature._bits >> 13) & 0x1)" /> + <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_signature._bits >> 18) & 0x7)" /> + <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_signature._bits >> 14) & 0x3)" /> + <Intrinsic Name="memX86ShiftValue" Expression="((_signature._bits >> 16) & 0x3)" /> + <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_signature._bits >> 21) & 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 << 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 >> 3) & 0x1)" /> <Intrinsic Name="immValue" Expression="((__int64)_data[1] << 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() > 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 && opType() != 3">_data[0]</Item> - <Item Name="_data[1]" Condition="opType() != 2 && 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 && 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 && 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() > 18">[UnknownNode {nodeType(), d}]</DisplayString> + <DisplayString Condition="nodeType() == asmjit::NodeType::kNone || nodeType() > 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)->_id</Item> <Item Name="nextSection" Condition="isSection()">((asmjit::SectionNode*)this)->_nextSection</Item> - <Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)->_id</Item> + <Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)->_labelId</Item> - <Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)->_alignMode</Item> + <Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)->_alignData._alignMode</Item> <Item Name="alignment" Condition="isAlign()">((asmjit::AlignNode*)this)->_alignment</Item> <Item Name="typeId" Condition="isEmbedData()">_embed._typeId, d</Item> @@ -175,15 +219,15 @@ <Item Name="inlineData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_inlineData</Item> <Item Name="externalData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_externalData</Item> - <Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)->_id</Item> + <Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)->_labelId</Item> - <Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_id</Item> - <Item Name="baseId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_baseId</Item> + <Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_labelId</Item> + <Item Name="baseLabelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_baseLabelId</Item> <Item Name="dataSize" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_dataSize</Item> <Item Name="constPool" Condition="isConstPool()">((asmjit::ConstPoolNode*)this)->_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)->_annotation</Item> @@ -194,7 +238,7 @@ <Item Name="args" Condition="isFunc()">((asmjit::FuncNode*)this)->_args, [((asmjit::FuncNode*)this)->_funcDetail._argCount]</Item> <Item Name="funcDetail" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_funcDetail</Item> - <Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_rets, [((asmjit::InvokeNode*)this)->_funcDetail._retCount]</Item> + <Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_rets</Item> <Item Name="args" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_args, [((asmjit::InvokeNode*)this)->_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(®, 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(®, type, s); + else + _newRegFmt(®, type, s, std::forward<Args>(args)...); + return reg; +#else + DebugUtils::unused(std::forward<Args>(args)...); + RegT reg(Globals::NoInit); + _newReg(®, 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(®._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(®._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>(), ®)); + 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_, ®)); + 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(§ion1, "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1) == kErrorOk); + EXPECT(code.sections()[1] == section1); + EXPECT(code.sectionsByOrder()[0] == section1); + + Section* section0; + EXPECT(code.newSection(§ion0, "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(§ion3, "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, ®Info); - + Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, ®Signature); 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, ®Info); + Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, ®Signature); 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(®s, 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(®s, 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(®s, 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(®s, 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(®s, 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(®s, 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(®s, 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(®s, 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(¶ms); 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(¶ms); //! ``` 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(®, 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(®s, 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(®s, 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(®s, 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(®s, 0x7, 1); - - if (bitTest(regs.eax, 5)) features.add(Features::kAVX512_BF16); - } - } - - // -------------------------------------------------------------------------- - // [CPUID EAX=0xD] - // -------------------------------------------------------------------------- - - if (maxId >= 0xD) { - cpuidQuery(®s, 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(®s, 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(®s, 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(®._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(®._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>(), ®)); - 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 $@ |