diff --git a/third_party/fadec/.build.yml b/third_party/fadec/.build.yml deleted file mode 100644 index 0f6334d..0000000 --- a/third_party/fadec/.build.yml +++ /dev/null @@ -1,16 +0,0 @@ -image: alpine/edge -sources: -- https://git.sr.ht/~aengelke/fadec -packages: -- meson -tasks: -- build: | - mkdir fadec-build1 - meson fadec-build1 fadec - ninja -C fadec-build1 - ninja -C fadec-build1 test - # Complete test with encode2 API. - mkdir fadec-build2 - meson fadec-build2 fadec -Dwith_encode2=true - ninja -C fadec-build2 - ninja -C fadec-build2 test diff --git a/third_party/fadec/.github/workflows/ci.yml b/third_party/fadec/.github/workflows/ci.yml deleted file mode 100644 index 6bf51b5..0000000 --- a/third_party/fadec/.github/workflows/ci.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: CI - -on: [push] - -jobs: - build-linux: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: sudo apt install -y ninja-build meson - - name: Configure - run: mkdir build; CC=clang CXX=clang++ meson -Dbuildtype=debugoptimized -Dwith_encode2=true build - - name: Build - run: ninja -v -C build - - name: Test - run: meson test -v -C build - build-linux-cmake: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: sudo apt install -y ninja-build cmake - - name: Configure - run: CC=clang CXX=clang++ cmake -B build -G Ninja -DFADEC_ENCODE2=ON - - name: Build - run: cmake --build build -v - - name: Test - run: ctest --test-dir build -V - build-windows: - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: pip install ninja meson - - name: Configure - run: mkdir build; meson setup --vsenv -Dbuildtype=debugoptimized -Dwith_encode2=true build - - name: Build - run: meson compile -v -C build - - name: Test - run: meson test -v -C build - build-windows-cmake: - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - - name: Configure - run: cmake -B build -DFADEC_ENCODE2=ON - - name: Build - run: cmake --build build -v - - name: Test - run: ctest --test-dir build -V -C Debug diff --git a/third_party/fadec/.gitignore b/third_party/fadec/.gitignore deleted file mode 100644 index 84c048a..0000000 --- a/third_party/fadec/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build/ diff --git a/third_party/fadec/CMakeLists.txt b/third_party/fadec/CMakeLists.txt deleted file mode 100644 index 4f27a59..0000000 --- a/third_party/fadec/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -cmake_minimum_required(VERSION 3.23) - -project(fadec LANGUAGES C) -enable_testing() - -# TODO: make this actually optional -enable_language(CXX OPTIONAL) - -# Options -set(FADEC_ARCHMODE "both" CACHE STRING "Support only 32-bit x86, 64-bit x86 or both") -set_property(CACHE FADEC_ARCHMODE PROPERTY STRINGS both only32 only64) - -option(FADEC_UNDOC "Include undocumented instructions" FALSE) -option(FADEC_DECODE "Include support for decoding" TRUE) -option(FADEC_ENCODE "Include support for encoding" TRUE) -option(FADEC_ENCODE2 "Include support for new encoding API" FALSE) - -set(CMAKE_C_STANDARD 11) - -if (MSVC) - add_compile_options(/W4 -D_CRT_SECURE_NO_WARNINGS /wd4018 /wd4146 /wd4244 /wd4245 /wd4267 /wd4310) - add_compile_options($<$:-Zc:preprocessor>) -else() - add_compile_options(-Wall -Wextra -Wpedantic -Wno-overlength-strings) -endif() - -find_package(Python3 3.9 REQUIRED) - -add_library(fadec) -add_library(fadec::fadec ALIAS fadec) -set_target_properties(fadec PROPERTIES - LINKER_LANGUAGE C -) - -set(GEN_ARGS "") -if (NOT FADEC_ARCHMODE STREQUAL "only64") - list(APPEND GEN_ARGS "--32") -endif () -if (NOT FADEC_ARCHMODE STREQUAL "only32") - list(APPEND GEN_ARGS "--64") -endif () -if (FADEC_UNDOC) - list(APPEND GEN_ARGS "--with-undoc") -endif () - -file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") - -function(fadec_component) - cmake_parse_arguments(ARG "" "NAME" "HEADERS;SOURCES" ${ARGN}) - - set(PRIV_INC ${CMAKE_CURRENT_BINARY_DIR}/include/fadec-${ARG_NAME}-private.inc) - set(PUB_INC ${CMAKE_CURRENT_BINARY_DIR}/include/fadec-${ARG_NAME}-public.inc) - - add_custom_command( - OUTPUT ${PRIV_INC} ${PUB_INC} - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/parseinstrs.py ${ARG_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/instrs.txt - ${PUB_INC} ${PRIV_INC} ${GEN_ARGS} - DEPENDS instrs.txt parseinstrs.py - COMMENT "Building table for ${ARG_NAME}" - ) - - list(APPEND FADEC_HEADERS ${PUB_INC}) - target_sources(fadec PRIVATE - ${ARG_SOURCES} - - PUBLIC - FILE_SET HEADERS - BASE_DIRS . - FILES - ${ARG_HEADERS} - - PUBLIC - FILE_SET generated_public TYPE HEADERS - BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include - FILES - ${PUB_INC} - - PRIVATE - FILE_SET generated_private TYPE HEADERS - BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include - FILES - ${PRIV_INC} - ) - - add_executable(fadec-${ARG_NAME}-test ${ARG_NAME}-test.c) - target_link_libraries(fadec-${ARG_NAME}-test PRIVATE fadec) - add_test(NAME ${ARG_NAME} COMMAND fadec-${ARG_NAME}-test) - - if (CMAKE_CXX_COMPILER AND ${ARG_NAME} STREQUAL "encode2") - add_executable(fadec-${ARG_NAME}-test-cpp ${ARG_NAME}-test.cc) - target_link_libraries(fadec-${ARG_NAME}-test-cpp PRIVATE fadec) - add_test(NAME ${ARG_NAME}-cpp COMMAND fadec-${ARG_NAME}-test-cpp) - endif() -endfunction() - -if (FADEC_DECODE) - fadec_component(NAME decode SOURCES decode.c format.c HEADERS fadec.h) -endif () -if (FADEC_ENCODE) - fadec_component(NAME encode SOURCES encode.c HEADERS fadec-enc.h) -endif () -if (FADEC_ENCODE2) - fadec_component(NAME encode2 SOURCES encode2.c HEADERS fadec-enc2.h) -endif () - -install(TARGETS fadec EXPORT fadec - LIBRARY - ARCHIVE - FILE_SET HEADERS FILE_SET generated_public) diff --git a/third_party/fadec/LICENSE b/third_party/fadec/LICENSE deleted file mode 100644 index 0f97558..0000000 --- a/third_party/fadec/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2018, Alexis Engelke -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/fadec/README.md b/third_party/fadec/README.md deleted file mode 100644 index eea732b..0000000 --- a/third_party/fadec/README.md +++ /dev/null @@ -1,184 +0,0 @@ -# Fadec — Fast Decoder for x86-32 and x86-64 and Encoder for x86-64 - -Fadec is a fast and lightweight decoder for x86-32 and x86-64. To meet the goal of speed, lookup tables are used to map the opcode the (internal) description of the instruction encoding. This table currently has a size of roughly 37 kiB (for 32/64-bit combined). - -Fadec-Enc (or Faenc) is a small, lightweight and easy-to-use encoder, currently for x86-64 only. - -## Key features - -> **Q: Why not just use any other decoding/encoding library available out there?** -> -> A: I needed to embed a small and fast decoder in a project for a freestanding environment (i.e., no libc). Further, only very few plain encoding libraries are available for x86-64; and most of them are large or make heavy use of external dependencies. - -- **Small size:** the entire library with the x86-64/32 decoder and the x86-64 encoder are only 95 kiB; for specific use cases, the size can be reduced even further (e.g., by dropping AVX-512). The main decode/encode routines are only a few hundreds lines of code. -- **Performance:** Fadec is significantly faster than libopcodes, Capstone, or Zydis due to the absence of high-level abstractions and the small lookup table. -- **Zero dependencies:** the entire library has no dependencies, even on the standard library, making it suitable for freestanding environments without a full libc or `malloc`-style memory allocation. -- **Correctness:** even corner cases should be handled correctly (if not, that's a bug), e.g., the order of prefixes, immediate sizes of jump instructions, the presence of the `lock` prefix, or properly handling VEX.W in 32-bit mode. - -All components of this library target the Intel 64 implementations of x86. While AMD64 is _mostly similar_, there are some minor differences (e.g. operand sizes for jump instructions, more instructions, `cr8` can be accessed with `lock` prefix, `f34190` is `xchg`, not `pause`) which are currently not handled. - -## Decoder Usage - -### Example -```c -uint8_t buffer[] = {0x49, 0x90}; -FdInstr instr; -// Decode from buffer into instr in 64-bit mode. -int ret = fd_decode(buffer, sizeof(buffer), 64, 0, &instr); -// ret<0 indicates an error, ret>0 the number of decoded bytes -// Relevant properties of instructions can now be queried using the FD_* macros. -// Or, we can format the instruction to a string buffer: -char fmtbuf[64]; -fd_format(&instr, fmtbuf, sizeof(fmtbuf)); -// fmtbuf now reads: "xchg r8, rax" -``` - -### API - -The API consists of two functions to decode and format instructions, as well as several accessor macros. A full documentation can be found in [fadec.h](fadec.h). Direct access of any structure fields is not recommended. - -- `int fd_decode(const uint8_t* buf, size_t len, int mode, uintptr_t address, FdInstr* out_instr)` - - Decode a single instruction. For internal performance reasons, note that: - - The decoded operand sizes are not always exact. However, the exact size can be reconstructed in all cases. - - An implicit `fwait` in FPU instructions is decoded as a separate instruction (matching the opcode layout in machine code). For example, `finit` is decoded as `FD_FWAIT` + `FD_FINIT` - - Return value: number of bytes used, or a negative value in case of an error. - - `buf`/`len`: buffer containing instruction bytes. At most 15 bytes will be read. If the instruction is longer than `len`, an error value is returned. - - `mode`: architecture mode, either `32` or `64`. - - `address`: set to `0`. (Obsolete use: virtual address of the decoded instruction.) - - `out_instr`: Pointer to the instruction buffer, might get written partially in case of an error. -- `void fd_format(const FdInstr* instr, char* buf, size_t len)` - - Format a single instruction to a human-readable format. - - `instr`: decoded instruction. - - `buf`/`len`: buffer for formatted instruction string -- Various accessor macros: see [fadec.h](fadec.h). - -## Encoder Usage - -The encoder has two API variants: "v1" has a single entry point (`fe_enc64`) and the instruction is specified as integer parameter. "v2" has one entry point per instruction. v2 is currently about 3x faster than v1, but also has much larger code size (v1: <10 kiB; v2: ~3 MiB) and takes much longer to compile. It is therefore off by default and can be enabled by passing `-Dwith_encode2=true` to Meson. Both variants are supported. - -### Example (API v1) - -```c -int failed = 0; -uint8_t buf[64]; -uint8_t* cur = buf; - -// xor eax, eax -failed |= fe_enc64(&cur, FE_XOR32rr, FE_AX, FE_AX); -// movzx ecx, byte ptr [rdi + 1*rax + 0] -failed |= fe_enc64(&cur, FE_MOVZXr32m8, FE_CX, FE_MEM(FE_DI, 1, FE_AX, 0)); -// test ecx, ecx -failed |= fe_enc64(&cur, FE_TEST32rr, FE_CX, FE_CX); -// jnz $ -// This will be replaced later; FE_JMPL enforces use of longest offset -uint8_t* fwd_jmp = cur; -failed |= fe_enc64(&cur, FE_JNZ|FE_JMPL, (intptr_t) cur); -uint8_t* loop_tgt = cur; -// add rax, rcx -failed |= fe_enc64(&cur, FE_ADD64rr, FE_AX, FE_CX); -// sub ecx, 1 -failed |= fe_enc64(&cur, FE_SUB32ri, FE_CX, 1); -// jnz loop_tgt -failed |= fe_enc64(&cur, FE_JNZ, (intptr_t) loop_tgt); -// (alternatively: fe_enc64(&cur, FE_Jcc|FE_CC_NZ, (intptr_t) loop_tgt).) -// Update previous jump to jump here. Note that we _must_ specify FE_JMPL too. -failed |= fe_enc64(&fwd_jmp, FE_JNZ|FE_JMPL, (intptr_t) cur); -// ret -failed |= fe_enc64(&cur, FE_RET); -// cur now points to the end of the buffer, failed indicates any failures. -``` - -### Example (API v2) - -```c -uint8_t buf[64]; -uint8_t* cur = buf; - -// xor eax, eax -cur += fe64_XOR32rr(cur, 0, FE_AX, FE_AX); -// movzx ecx, byte ptr [rdi + 1*rax + 0] -cur += fe64_MOVZXr32m8(cur, 0, FE_CX, FE_MEM(FE_DI, 1, FE_AX, 0)); -// test ecx, ecx -cur += fe64_TEST32rr(cur, 0, FE_CX, FE_CX); -// jnz $ -// This will be replaced later; FE_JMPL enforces use of longest offset -uint8_t* fwd_jmp = cur; -cur += fe64_JNZ(cur, FE_JMPL, cur); -uint8_t* loop_tgt = cur; -// add rax, rcx -cur += fe64_ADD64rr(cur, 0, FE_AX, FE_CX); -// sub ecx, 1 -cur += fe64_SUB32ri(cur, 0, FE_CX, 1); -// jnz loop_tgt -cur += fe64_JNZ(cur, 0, loop_tgt); -// (alternatively: fe64_Jcc(cur, FE_CC_NZ, loop_tgt).) -// Update previous jump to jump here. Note that we _must_ specify FE_JMPL too. -fe64_JNZ(fwd_jmp, FE_JMPL, cur); -// ret -cur += fe64_RET(cur, 0); -// cur now points to the end of the buffer -// errors are ignored, this example should not cause any :-) -``` - -### API v1 - -The API consists of one function to handle encode requests, as well as some macros. More information can be found in [fadec-enc.h](fadec-enc.h). Usage of internals like enum values is not recommended. - -- `int fe_enc64(uint8_t** buf, uint64_t mnem, int64_t operands...)` - - Encodes an instruction for x86-64 into `*buf`. EVEX-encoded instructions will transparently encode with the shorter VEX prefix where permitted. - - Return value: `0` on success, a negative value in error cases. - - `buf`: Pointer to the pointer to the instruction buffer. The pointer (`*buf`) will be advanced by the number of bytes written. The instruction buffer must have at least 15 bytes left. - - `mnem`: Instruction mnemonic to encode combined with extra flags: - - `FE_SEG(segreg)`: override segment to specified segment register. - - `FE_ADDR32`: override address size to 32-bit. - - `FE_JMPL`: use longest possible offset encoding, useful when jump target is not known. - - `FE_MASK(maskreg)`: specify non-zero mask register (1--7) for instructions that support masking (suffixed with `_mask` or `_maskz`) or require a mask (AVX-512 gather/scatter). - - `FE_RC_RN/RD/RU/RZ`: set rounding mode for instructions with static rounding control (suffixed `_er`). - - `FE_CC_O/NO/E/NE/...`: set condition code for instructions with unspecified condition code (`Jcc`, `SETcc`, `CMOVcc`, `CMPccXADD`). - - `operands...`: Up to 4 instruction operands. The operand kinds must match the requirements of the mnemonic. - - For register operands (`r`=non-mask register, `k`=mask register), use the register: `FE_AX`, `FE_AH`, `FE_XMM12`. - - For immediate operands (`i`=regular, `a`=absolute address), use the constant: `12`, `-0xbeef`. - - For memory operands (`m`=regular or `b`=broadcast), use: `FE_MEM(basereg,scale,indexreg,offset)`. Use `0` to specify _no register_. For RIP-relative addressing, the size of the instruction is added automatically. - - For offset operands (`o`), specify the target address. - -### API v2 - -The API consists of one function per instruction, as well as some macros. The API provides type safety for different register types as well as for memory operands (regular vs. VSIB). Besides a few details listed here, the usage is very similar to API v1. More information can be found in [fadec-enc2.h](fadec-enc2.h). Usage of internals like enum values is not recommended. - -- `int fe64_(uint8_t* buf, int flags, )` - - Encodes the specified instruction for x86-64 into `buf`. EVEX-encoded instructions will transparently encode with the shorter VEX prefix where permitted. - - Return value: `0` on failure, otherwise the instruction length. - - `buf`: Pointer to the instruction buffer. The instruction buffer must have at least 15 bytes left. Bytes beyond the returned instruction length can be overwritten. - - `flags`: combination of extra flags, default to `0`: - - `FE_SEG(segreg)`: override segment to specified segment register. - - `FE_ADDR32`: override address size to 32-bit. - - `FE_JMPL`: use longest possible offset encoding, useful when jump target is not known. - - `FE_RC_RN/RD/RU/RZ`: set rounding mode for instructions with static rounding control (suffixed `_er`). - - `FE_CC_O/NO/E/NE/...`: set condition code for instructions with unspecified condition code (`Jcc`, `SETcc`, `CMOVcc`, `CMPccXADD`). - - `FeRegMASK opmask` (instructions with opmask only): specify non-zero mask register (1--7) for instructions suffixed with `_mask`/`_maskz` and AVX-512 gather/scatter. - - `operands...`: up to four instruction operands. - - Registers have types `FeRegGP`/`FeRegXMM`/`FeRegMASK`/etc.; byte registers accepting high-byte operands also accept `FeRegGPH`. - - Immediate operands have an appropriately sized integer type. - - Memory operands use a `FeMem` (VSIB: `FeMemV`) structure, use the macro `FE_MEM(basereg,scale,indexreg,offset)` (VSIB: `FE_MEMV(...)`). Use `FE_NOREG` to specify _no register_. For RIP-relative addressing, the size of the instruction is added automatically. - - For offset operands (`o`), specify the target address relative to `buf`. -- `int fe64_NOP(uint8_t* buf, unsigned size)` - - Encode a series of `nop`s of `size` bytes, but at least emit one byte. This will use larger the `nop` encodings to reduce the number of instructions and is intended for filling padding. - -## Known issues -- Decoder/Encoder: register uniqueness constraints are not enforced. This affects: - - VSIB-encoded instructions: no vector register may be used more than once - - AMX instructions: no tile register may be used more than once - - AVX-512 complex FP16 multiplication: destination must be not be equal to a source register -- Prefixes for indirect jumps and calls are not properly decoded, e.g. `notrack`, `bnd`. -- Low test coverage. (Help needed.) -- No Python API. - -Some ISA extensions are not supported, often because they are deprecated or unsupported by recent hardware. These are unlikely to be implemented in the near future: - -- (Intel) MPX: Intel lists MPX as deprecated. -- (Intel) HLE prefixes `xacquire`/`xrelease`: Intel lists HLE as deprecated. The formatter for decoded instructions is able to reconstruct these in most cases, though. -- (Intel) Xeon Phi (KNC/KNL/KNM) extensions, including the MVEX prefix: the hardware is discontinued/no longer available. -- (AMD) XOP: unsupported by newer hardware. -- (AMD) FMA4: unsupported by newer hardware. - -If you find any other issues, please report a bug. Or, even better, send a patch fixing the issue. diff --git a/third_party/fadec/decode-test.c b/third_party/fadec/decode-test.c deleted file mode 100644 index f8d80cc..0000000 --- a/third_party/fadec/decode-test.c +++ /dev/null @@ -1,3248 +0,0 @@ - -#include -#include -#include -#include - -#include - - -static -void -print_hex(const uint8_t* buf, size_t len) -{ - for (size_t i = 0; i < len; i++) - printf("%02x", buf[i]); -} - -static -int -test(const void* buf, size_t buf_len, unsigned mode, const char* exp_fmt) -{ - FdInstr instr; - char fmt[128]; - - memset(fmt, 0, sizeof(fmt)); - int retval = fd_decode(buf, buf_len, mode, 0, &instr); - - if (retval == FD_ERR_INTERNAL) { - return 0; // not compiled with this arch-mode (32/64 bit) - } else if (retval == FD_ERR_PARTIAL) { - strcpy(fmt, "PARTIAL"); - } else if (retval == FD_ERR_UD) { - strcpy(fmt, "UD"); - } else { - fd_format(&instr, fmt, sizeof(fmt)); - } - - if ((retval < 0 || (unsigned) retval == buf_len)) { - if (!strcmp(fmt, exp_fmt)) - return 0; - // Consider 32/64 bit differences, e.g. for addressing mode. - const char* it = exp_fmt; - while ((it = (const char*) strchr(it, '@'))) { - if (fmt[it - exp_fmt] == (mode != 64 ? 'e' : 'r')) - fmt[it - exp_fmt] = '@'; - it++; - } - if (!strcmp(fmt, exp_fmt)) - return 0; - } - - printf("Failed case (%u-bit): ", mode); - print_hex(buf, buf_len); - printf("\n Exp (%2zu): %s", buf_len, exp_fmt); - printf("\n Got (%2d): %s\n", retval, fmt); - return -1; -} - -#define TEST1(mode, buf, exp_fmt) test(buf, sizeof(buf)-1, mode, exp_fmt) -#define TEST32(...) failed |= TEST1(32, __VA_ARGS__) -#define TEST64(...) failed |= TEST1(64, __VA_ARGS__) -#define TEST3264(buf, exp_fmt32, exp_fmt64) \ - failed |= TEST1(32, buf, exp_fmt32) | TEST1(64, buf, exp_fmt64) -#define TEST(...) failed |= TEST1(32, __VA_ARGS__) | TEST1(64, __VA_ARGS__) - -int -main(int argc, char** argv) -{ - (void) argc; (void) argv; - - int failed = 0; - - TEST("\x90", "nop"); - TEST("\xac", "lodsb"); - TEST3264("\x26\xac", "es lodsb", "lodsb"); - TEST3264("\x2e\xac", "cs lodsb", "lodsb"); - TEST3264("\x36\xac", "ss lodsb", "lodsb"); - TEST3264("\x3e\xac", "ds lodsb", "lodsb"); - TEST("\x64\xac", "fs lodsb"); - TEST("\x65\xac", "gs lodsb"); - TEST3264("\x2e\x2e\xac", "cs lodsb", "lodsb"); - TEST3264("\x2e\x26\xac", "es lodsb", "lodsb"); - TEST3264("\x26\x2e\xac", "cs lodsb", "lodsb"); - TEST3264("\x26\x65\xac", "gs lodsb", "gs lodsb"); - TEST3264("\x65\x26\xac", "es lodsb", "gs lodsb"); - TEST("\x01\x00", "add dword ptr [@ax], eax"); - TEST3264("\x26\x01\x00", "add dword ptr es:[eax], eax", "add dword ptr [rax], eax"); - TEST3264("\x2e\x01\x00", "add dword ptr cs:[eax], eax", "add dword ptr [rax], eax"); - TEST3264("\x36\x01\x00", "add dword ptr ss:[eax], eax", "add dword ptr [rax], eax"); - TEST3264("\x3e\x01\x00", "add dword ptr ds:[eax], eax", "add dword ptr [rax], eax"); - TEST("\x64\x01\x00", "add dword ptr fs:[@ax], eax"); - TEST("\x65\x01\x00", "add dword ptr gs:[@ax], eax"); - TEST("\x0f\x10\xc1", "movups xmm0, xmm1"); - TEST("\x66\x0f\x10\xc1", "movupd xmm0, xmm1"); - TEST("\xf2\x66\x0f\x10\xc1", "movsd xmm0, xmm1"); - TEST("\xf3\x66\x0f\x10\xc1", "movss xmm0, xmm1"); - TEST("\xf3\xf2\x66\x0f\x10\xc1", "movsd xmm0, xmm1"); - TEST("\xf2\x66\xf3\x66\x0f\x10\xc1", "movss xmm0, xmm1"); - - TEST64("\x48\x91", "xchg rcx, rax"); - TEST64("\x48\x26\x91", "xchg ecx, eax"); - TEST("\x90", "nop"); - TEST("\xf2\x90", "nop"); - TEST("\x66\x90", "nop"); // NB: could be xchg ax, ax - TEST("\x66\xf2\x90", "nop"); // NB: could be xchg ax, ax - TEST64("\x41\x90", "xchg r8d, eax"); - TEST64("\xf2\x41\x90", "xchg r8d, eax"); - TEST64("\x66\x41\x90", "xchg r8w, ax"); - TEST64("\x66\xf2\x41\x90", "xchg r8w, ax"); - TEST64("\x48\x90", "nop"); // NB: could be xchg rax, rax - TEST64("\xf2\x48\x90", "nop"); // NB: could be xchg rax, rax - TEST64("\x66\x48\x90", "nop"); // NB: could be xchg rax, rax - TEST64("\x66\xf2\x48\x90", "nop"); // NB: could be xchg rax, rax - TEST64("\x49\x90", "xchg r8, rax"); - TEST64("\xf2\x49\x90", "xchg r8, rax"); - TEST64("\x66\x49\x90", "xchg r8, rax"); - TEST64("\x66\xf2\x49\x90", "xchg r8, rax"); - TEST("\xf3\x90", "pause"); - TEST("\x66\xf3\x90", "pause"); - TEST64("\xf3\x41\x90", "pause"); // NB: xchg for AMD - TEST64("\x66\xf3\x41\x90", "pause"); // NB: xchg for AMD - TEST64("\xf3\x48\x90", "pause"); - TEST64("\x66\xf3\x48\x90", "pause"); - TEST64("\xf3\x49\x90", "pause"); // NB: xchg for AMD - TEST64("\x66\xf3\x49\x90", "pause"); // NB: xchg for AMD - TEST("\xf3\x91", "xchg ecx, eax"); - - TEST("\x0f\xc7\x0f", "cmpxchg8b qword ptr [@di]"); - TEST("\x66\x0f\xc7\x0f", "cmpxchg8b qword ptr [@di]"); // 66h is ignored - TEST64("\x48\x0f\xc7\x0f", "cmpxchg16b xmmword ptr [rdi]"); - TEST("\xf2\x0f\xc7\x0f", "cmpxchg8b qword ptr [@di]"); - TEST("\xf3\x0f\xc7\x0f", "cmpxchg8b qword ptr [@di]"); - TEST("\xf2\xf0\x0f\xc7\x0f", "xacquire lock cmpxchg8b qword ptr [@di]"); - TEST("\xf3\xf0\x0f\xc7\x0f", "xrelease lock cmpxchg8b qword ptr [@di]"); - TEST("\x87\x0f", "xchg dword ptr [@di], ecx"); - TEST("\xf2\x87\x0f", "xacquire xchg dword ptr [@di], ecx"); - TEST("\xf3\x87\x0f", "xrelease xchg dword ptr [@di], ecx"); - TEST("\xf2\xf0\x87\x0f", "xacquire lock xchg dword ptr [@di], ecx"); - TEST("\xf3\xf0\x87\x0f", "xrelease lock xchg dword ptr [@di], ecx"); - TEST("\xc6\x07\x12", "mov byte ptr [@di], 0x12"); - TEST("\xf2\xc6\x07\x12", "mov byte ptr [@di], 0x12"); // no xacquire - TEST("\xf3\xc6\x07\x12", "xrelease mov byte ptr [@di], 0x12"); - TEST("\x66\xc7\x07\x34\x12", "mov word ptr [@di], 0x1234"); - TEST("\x66\xf2\xc7\x07\x34\x12", "mov word ptr [@di], 0x1234"); // no xacquire - TEST("\x66\xf3\xc7\x07\x34\x12", "xrelease mov word ptr [@di], 0x1234"); - TEST64("\xf0\xff\xc0", "UD"); // lock with register operand is UD - TEST64("\xf0\xd0\x00", "UD"); // lock with rol is UD - TEST("\x66", "PARTIAL"); - TEST("\xf0", "PARTIAL"); - TEST("\x0f", "PARTIAL"); - TEST("\x0f\x38", "PARTIAL"); - TEST("\x0f\x3a", "PARTIAL"); - TEST("\x80", "PARTIAL"); - TEST("\x80\x04", "PARTIAL"); - TEST("\x80\x40", "PARTIAL"); - TEST("\x80\x80\x00\x00\x00", "PARTIAL"); - TEST("\xb0", "PARTIAL"); - TEST("\xb8", "PARTIAL"); - TEST("\xb8\x00", "PARTIAL"); - TEST("\xb8\x00\x00", "PARTIAL"); - TEST("\xb8\x00\x00\x00", "PARTIAL"); - TEST("\x0F\x01\x22", "smsw word ptr [@dx]"); - TEST64("\x48\x0F\x01\x22", "smsw word ptr [rdx]"); - TEST("\x66\x0F\x01\x22", "smsw word ptr [@dx]"); - TEST("\x0F\x01\xE2", "smsw edx"); - TEST("\x66\x0F\x01\xE2", "smsw dx"); - TEST64("\x66\x48\x0F\x01\xE2", "smsw rdx"); - TEST64("\xf2\x66\x0f\x01\x23", "smsw word ptr [rbx]"); - TEST("\x66\x0f\x20\x00", "mov @ax, cr0"); // mod=0, 66h - TEST("\xf3\x0f\x20\x00", "mov @ax, cr0"); // REP - TEST("\x0f\x20\xc8", "UD"); // cr1 - TEST("\x0f\x20\xd0", "mov @ax, cr2"); // cr2 - TEST64("\x48\x0f\x20\xd0", "mov rax, cr2"); // cr2 + REX.W - TEST("\x0f\x20\xd8", "mov @ax, cr3"); // cr3 - TEST("\x0f\x20\xe0", "mov @ax, cr4"); // cr4 - TEST3264("\x0f\x20\xe8", "UD", "UD"); // cr5 - TEST64("\x44\x0f\x20\x00", "mov rax, cr8"); // cr8 - TEST64("\x45\x0f\x20\x00", "mov r8, cr8"); // cr8 - TEST64("\x44\x0f\x20\x08", "UD"); // cr9 - TEST64("\x44\x0f\x21\x00", "UD"); // dr8 - TEST32("\xf0\x0f\x20\x00", "UD"); // LOCK - TEST("\x8c\xc0", "mov ax, es"); - TEST64("\x44\x8c\xc0", "mov ax, es"); - TEST64("\x44\x8c\xf0", "UD"); // no segment register 6 - TEST64("\x44\x8c\xf8", "UD"); // no segment register 7 - TEST("\x8e\xc0", "mov es, ax"); - TEST("\x8e\xc8", "UD"); // No mov cs, eax - TEST("\x0f\x1e\xc0", "nop eax, eax"); // reserved nop - TEST("\x0f\x1e\x04\x25\x01\x00\x00\x00", "nop dword ptr [0x1], eax"); // reserved nop - TEST64("\xf3\x4f\x0f\x1e\xfc", "nop r12, r15"); // reserved nop - TEST("\xd8\xc1", "fadd st(0), st(1)"); - TEST("\xdc\xc1", "fadd st(1), st(0)"); - TEST64("\x41\xd8\xc1", "fadd st(0), st(1)"); // REX.B ignored - TEST64("\xd9\xc9", "fxch st(1)"); - TEST64("\xd9\xd0", "fnop"); - TEST("\xdf\xe0", "fstsw ax"); - TEST64("\x41\xdf\xe0", "fstsw ax"); - - // ModRM Test cases - // reg - TEST("\x01\xc0", "add eax, eax"); - TEST("\x01\xc1", "add ecx, eax"); - TEST("\x01\xd0", "add eax, edx"); - TEST("\x01\xff", "add edi, edi"); - TEST64("\x41\x01\xd0", "add r8d, edx"); - TEST64("\x45\x01\xd0", "add r8d, r10d"); - TEST64("\x45\x01\xff", "add r15d, r15d"); - // [reg] - TEST("\x01\x00", "add dword ptr [@ax], eax"); - TEST("\x01\x08", "add dword ptr [@ax], ecx"); - TEST("\x01\x01", "add dword ptr [@cx], eax"); - TEST("\x01\x07", "add dword ptr [@di], eax"); - TEST("\x01\x38", "add dword ptr [@ax], edi"); - TEST("\x01\x04\x24", "add dword ptr [@sp], eax"); - TEST64("\x41\x01\x00", "add dword ptr [r8], eax"); - TEST64("\x44\x01\x08", "add dword ptr [rax], r9d"); - TEST64("\x45\x01\x00", "add dword ptr [r8], r8d"); - TEST64("\x41\x01\x07", "add dword ptr [r15], eax"); - TEST64("\x41\x01\x04\x24", "add dword ptr [r12], eax"); - // [disp32] - TEST32("\x01\x05\x01\x00\x00\x00", "add dword ptr [0x1], eax"); - TEST32("\x01\x05\xff\xff\xff\xff", "add dword ptr [0xffffffff], eax"); - TEST("\x01\x04\x25\x01\x00\x00\x00", "add dword ptr [0x1], eax"); - TEST3264("\x01\x04\x25\x00\x00\x00\x80", "add dword ptr [0x80000000], eax", "add dword ptr [0xffffffff80000000], eax"); - TEST64("\x41\x01\x04\x25\x01\x00\x00\x00", "add dword ptr [0x1], eax"); - TEST("\x01\x04\x25\x00\x00\x00\x00", "add dword ptr [0x0], eax"); - // [rip+disp32] - TEST64("\x01\x05\x01\x00\x00\x00", "add dword ptr [rip+0x1], eax"); - TEST64("\x41\x01\x05\x01\x00\x00\x00", "add dword ptr [rip+0x1], eax"); - TEST64("\x67\x01\x05\x01\x00\x00\x00", "add dword ptr [eip+0x1], eax"); - TEST64("\x67\x41\x01\x05\x01\x00\x00\x00", "add dword ptr [eip+0x1], eax"); - // [reg+disp32] - TEST("\x01\x80\x01\x00\x00\x00", "add dword ptr [@ax+0x1], eax"); - TEST("\x01\x80\x00\x00\x00\x80", "add dword ptr [@ax-0x80000000], eax"); - // [reg+eiz+disp32] - TEST("\x01\x84\x25\x01\x00\x00\x00", "add dword ptr [@bp+0x1], eax"); - // [reg+s*reg+disp32] - TEST64("\x42\x01\x84\x25\x01\x00\x00\x00", "add dword ptr [rbp+1*r12+0x1], eax"); - // [s*reg] - TEST("\x01\x04\x8d\x00\x00\x00\x00", "add dword ptr [4*@cx], eax"); - - // 32-bit+67 ModRM cases. reg=0 - TEST32("\x67\x01\x00", "add dword ptr [bx+1*si], eax"); - TEST32("\x67\x01\x01", "add dword ptr [bx+1*di], eax"); - TEST32("\x67\x01\x02", "add dword ptr [bp+1*si], eax"); - TEST32("\x67\x01\x03", "add dword ptr [bp+1*di], eax"); - TEST32("\x67\x01\x04", "add dword ptr [1*si], eax"); - TEST32("\x67\x01\x05", "add dword ptr [1*di], eax"); - TEST32("\x67\x01\x06\x11\x22", "add dword ptr [0x2211], eax"); - TEST32("\x67\x01\x06\xf0\xff", "add dword ptr [0xfff0], eax"); - TEST32("\x67\x01\x07", "add dword ptr [bx], eax"); - TEST32("\x67\x01\x40\x12", "add dword ptr [bx+1*si+0x12], eax"); - TEST32("\x67\x01\x40\x99", "add dword ptr [bx+1*si-0x67], eax"); - TEST32("\x67\x01\x41\x12", "add dword ptr [bx+1*di+0x12], eax"); - TEST32("\x67\x01\x41\x99", "add dword ptr [bx+1*di-0x67], eax"); - TEST32("\x67\x01\x42\x12", "add dword ptr [bp+1*si+0x12], eax"); - TEST32("\x67\x01\x42\x99", "add dword ptr [bp+1*si-0x67], eax"); - TEST32("\x67\x01\x43\x12", "add dword ptr [bp+1*di+0x12], eax"); - TEST32("\x67\x01\x43\x99", "add dword ptr [bp+1*di-0x67], eax"); - TEST32("\x67\x01\x44\x12", "add dword ptr [1*si+0x12], eax"); - TEST32("\x67\x01\x44\x99", "add dword ptr [1*si-0x67], eax"); - TEST32("\x67\x01\x45\x12", "add dword ptr [1*di+0x12], eax"); - TEST32("\x67\x01\x45\x99", "add dword ptr [1*di-0x67], eax"); - TEST32("\x67\x01\x46\x12", "add dword ptr [bp+0x12], eax"); - TEST32("\x67\x01\x46\x99", "add dword ptr [bp-0x67], eax"); - TEST32("\x67\x01\x47\x12", "add dword ptr [bx+0x12], eax"); - TEST32("\x67\x01\x47\x99", "add dword ptr [bx-0x67], eax"); - TEST32("\x67\x01\x80\x11\x22", "add dword ptr [bx+1*si+0x2211], eax"); - TEST32("\x67\x01\x80\xf0\xff", "add dword ptr [bx+1*si-0x10], eax"); - TEST32("\x67\x01\x81\x11\x22", "add dword ptr [bx+1*di+0x2211], eax"); - TEST32("\x67\x01\x81\xf0\xff", "add dword ptr [bx+1*di-0x10], eax"); - TEST32("\x67\x01\x82\x11\x22", "add dword ptr [bp+1*si+0x2211], eax"); - TEST32("\x67\x01\x82\xf0\xff", "add dword ptr [bp+1*si-0x10], eax"); - TEST32("\x67\x01\x83\x11\x22", "add dword ptr [bp+1*di+0x2211], eax"); - TEST32("\x67\x01\x83\xf0\xff", "add dword ptr [bp+1*di-0x10], eax"); - TEST32("\x67\x01\x84\x11\x22", "add dword ptr [1*si+0x2211], eax"); - TEST32("\x67\x01\x84\xf0\xff", "add dword ptr [1*si-0x10], eax"); - TEST32("\x67\x01\x85\x11\x22", "add dword ptr [1*di+0x2211], eax"); - TEST32("\x67\x01\x85\xf0\xff", "add dword ptr [1*di-0x10], eax"); - TEST32("\x67\x01\x86\x11\x22", "add dword ptr [bp+0x2211], eax"); - TEST32("\x67\x01\x86\xf0\xff", "add dword ptr [bp-0x10], eax"); - TEST32("\x67\x01\x87\x11\x22", "add dword ptr [bx+0x2211], eax"); - TEST32("\x67\x01\x87\xf0\xff", "add dword ptr [bx-0x10], eax"); - TEST32("\x67\x01", "PARTIAL"); - TEST32("\x67\x01\x47", "PARTIAL"); - TEST32("\x67\x01\x80", "PARTIAL"); - TEST32("\x67\x01\x80\x11", "PARTIAL"); - - // 32-bit, 64-bit and 64-bit+67 ModRM+SIB cases. scale=2, reg=0 - TEST("\x01\x00", "add dword ptr [@ax], eax"); - TEST64("\x67\x01\x00", "add dword ptr [eax], eax"); - TEST("\x01\x01", "add dword ptr [@cx], eax"); - TEST64("\x67\x01\x01", "add dword ptr [ecx], eax"); - TEST("\x01\x02", "add dword ptr [@dx], eax"); - TEST64("\x67\x01\x02", "add dword ptr [edx], eax"); - TEST("\x01\x03", "add dword ptr [@bx], eax"); - TEST64("\x67\x01\x03", "add dword ptr [ebx], eax"); - TEST("\x01\x04\x80", "add dword ptr [@ax+4*@ax], eax"); - TEST64("\x67\x01\x04\x80", "add dword ptr [eax+4*eax], eax"); - TEST("\x01\x04\x81", "add dword ptr [@cx+4*@ax], eax"); - TEST64("\x67\x01\x04\x81", "add dword ptr [ecx+4*eax], eax"); - TEST("\x01\x04\x82", "add dword ptr [@dx+4*@ax], eax"); - TEST64("\x67\x01\x04\x82", "add dword ptr [edx+4*eax], eax"); - TEST("\x01\x04\x83", "add dword ptr [@bx+4*@ax], eax"); - TEST64("\x67\x01\x04\x83", "add dword ptr [ebx+4*eax], eax"); - TEST("\x01\x04\x84", "add dword ptr [@sp+4*@ax], eax"); - TEST64("\x67\x01\x04\x84", "add dword ptr [esp+4*eax], eax"); - TEST("\x01\x04\x85\x11\x22\x33\x44", "add dword ptr [4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x04\x85\x11\x22\x33\x44", "add dword ptr [4*eax+0x44332211], eax"); - TEST("\x01\x04\x86", "add dword ptr [@si+4*@ax], eax"); - TEST64("\x67\x01\x04\x86", "add dword ptr [esi+4*eax], eax"); - TEST("\x01\x04\x87", "add dword ptr [@di+4*@ax], eax"); - TEST64("\x67\x01\x04\x87", "add dword ptr [edi+4*eax], eax"); - TEST("\x01\x04\x88", "add dword ptr [@ax+4*@cx], eax"); - TEST64("\x67\x01\x04\x88", "add dword ptr [eax+4*ecx], eax"); - TEST("\x01\x04\x89", "add dword ptr [@cx+4*@cx], eax"); - TEST64("\x67\x01\x04\x89", "add dword ptr [ecx+4*ecx], eax"); - TEST("\x01\x04\x8a", "add dword ptr [@dx+4*@cx], eax"); - TEST64("\x67\x01\x04\x8a", "add dword ptr [edx+4*ecx], eax"); - TEST("\x01\x04\x8b", "add dword ptr [@bx+4*@cx], eax"); - TEST64("\x67\x01\x04\x8b", "add dword ptr [ebx+4*ecx], eax"); - TEST("\x01\x04\x8c", "add dword ptr [@sp+4*@cx], eax"); - TEST64("\x67\x01\x04\x8c", "add dword ptr [esp+4*ecx], eax"); - TEST("\x01\x04\x8d\x11\x22\x33\x44", "add dword ptr [4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x04\x8d\x11\x22\x33\x44", "add dword ptr [4*ecx+0x44332211], eax"); - TEST("\x01\x04\x8e", "add dword ptr [@si+4*@cx], eax"); - TEST64("\x67\x01\x04\x8e", "add dword ptr [esi+4*ecx], eax"); - TEST("\x01\x04\x8f", "add dword ptr [@di+4*@cx], eax"); - TEST64("\x67\x01\x04\x8f", "add dword ptr [edi+4*ecx], eax"); - TEST("\x01\x04\x90", "add dword ptr [@ax+4*@dx], eax"); - TEST64("\x67\x01\x04\x90", "add dword ptr [eax+4*edx], eax"); - TEST("\x01\x04\x91", "add dword ptr [@cx+4*@dx], eax"); - TEST64("\x67\x01\x04\x91", "add dword ptr [ecx+4*edx], eax"); - TEST("\x01\x04\x92", "add dword ptr [@dx+4*@dx], eax"); - TEST64("\x67\x01\x04\x92", "add dword ptr [edx+4*edx], eax"); - TEST("\x01\x04\x93", "add dword ptr [@bx+4*@dx], eax"); - TEST64("\x67\x01\x04\x93", "add dword ptr [ebx+4*edx], eax"); - TEST("\x01\x04\x94", "add dword ptr [@sp+4*@dx], eax"); - TEST64("\x67\x01\x04\x94", "add dword ptr [esp+4*edx], eax"); - TEST("\x01\x04\x95\x11\x22\x33\x44", "add dword ptr [4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x04\x95\x11\x22\x33\x44", "add dword ptr [4*edx+0x44332211], eax"); - TEST("\x01\x04\x96", "add dword ptr [@si+4*@dx], eax"); - TEST64("\x67\x01\x04\x96", "add dword ptr [esi+4*edx], eax"); - TEST("\x01\x04\x97", "add dword ptr [@di+4*@dx], eax"); - TEST64("\x67\x01\x04\x97", "add dword ptr [edi+4*edx], eax"); - TEST("\x01\x04\x98", "add dword ptr [@ax+4*@bx], eax"); - TEST64("\x67\x01\x04\x98", "add dword ptr [eax+4*ebx], eax"); - TEST("\x01\x04\x99", "add dword ptr [@cx+4*@bx], eax"); - TEST64("\x67\x01\x04\x99", "add dword ptr [ecx+4*ebx], eax"); - TEST("\x01\x04\x9a", "add dword ptr [@dx+4*@bx], eax"); - TEST64("\x67\x01\x04\x9a", "add dword ptr [edx+4*ebx], eax"); - TEST("\x01\x04\x9b", "add dword ptr [@bx+4*@bx], eax"); - TEST64("\x67\x01\x04\x9b", "add dword ptr [ebx+4*ebx], eax"); - TEST("\x01\x04\x9c", "add dword ptr [@sp+4*@bx], eax"); - TEST64("\x67\x01\x04\x9c", "add dword ptr [esp+4*ebx], eax"); - TEST("\x01\x04\x9d\x11\x22\x33\x44", "add dword ptr [4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x04\x9d\x11\x22\x33\x44", "add dword ptr [4*ebx+0x44332211], eax"); - TEST("\x01\x04\x9e", "add dword ptr [@si+4*@bx], eax"); - TEST64("\x67\x01\x04\x9e", "add dword ptr [esi+4*ebx], eax"); - TEST("\x01\x04\x9f", "add dword ptr [@di+4*@bx], eax"); - TEST64("\x67\x01\x04\x9f", "add dword ptr [edi+4*ebx], eax"); - TEST("\x01\x04\xa0", "add dword ptr [@ax], eax"); - TEST64("\x67\x01\x04\xa0", "add dword ptr [eax], eax"); - TEST("\x01\x04\xa1", "add dword ptr [@cx], eax"); - TEST64("\x67\x01\x04\xa1", "add dword ptr [ecx], eax"); - TEST("\x01\x04\xa2", "add dword ptr [@dx], eax"); - TEST64("\x67\x01\x04\xa2", "add dword ptr [edx], eax"); - TEST("\x01\x04\xa3", "add dword ptr [@bx], eax"); - TEST64("\x67\x01\x04\xa3", "add dword ptr [ebx], eax"); - TEST("\x01\x04\xa4", "add dword ptr [@sp], eax"); - TEST64("\x67\x01\x04\xa4", "add dword ptr [esp], eax"); - TEST3264("\x01\x04\xa5\x11\x22\x33\x44", "add dword ptr [0x44332211], eax", "add dword ptr [0x44332211], eax"); - TEST64("\x67\x01\x04\xa5\x11\x22\x33\x44", "add dword ptr [0x44332211], eax"); - TEST("\x01\x04\xa6", "add dword ptr [@si], eax"); - TEST64("\x67\x01\x04\xa6", "add dword ptr [esi], eax"); - TEST("\x01\x04\xa7", "add dword ptr [@di], eax"); - TEST64("\x67\x01\x04\xa7", "add dword ptr [edi], eax"); - TEST("\x01\x04\xa8", "add dword ptr [@ax+4*@bp], eax"); - TEST64("\x67\x01\x04\xa8", "add dword ptr [eax+4*ebp], eax"); - TEST("\x01\x04\xa9", "add dword ptr [@cx+4*@bp], eax"); - TEST64("\x67\x01\x04\xa9", "add dword ptr [ecx+4*ebp], eax"); - TEST("\x01\x04\xaa", "add dword ptr [@dx+4*@bp], eax"); - TEST64("\x67\x01\x04\xaa", "add dword ptr [edx+4*ebp], eax"); - TEST("\x01\x04\xab", "add dword ptr [@bx+4*@bp], eax"); - TEST64("\x67\x01\x04\xab", "add dword ptr [ebx+4*ebp], eax"); - TEST("\x01\x04\xac", "add dword ptr [@sp+4*@bp], eax"); - TEST64("\x67\x01\x04\xac", "add dword ptr [esp+4*ebp], eax"); - TEST("\x01\x04\xad\x11\x22\x33\x44", "add dword ptr [4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x04\xad\x11\x22\x33\x44", "add dword ptr [4*ebp+0x44332211], eax"); - TEST("\x01\x04\xae", "add dword ptr [@si+4*@bp], eax"); - TEST64("\x67\x01\x04\xae", "add dword ptr [esi+4*ebp], eax"); - TEST("\x01\x04\xaf", "add dword ptr [@di+4*@bp], eax"); - TEST64("\x67\x01\x04\xaf", "add dword ptr [edi+4*ebp], eax"); - TEST("\x01\x04\xb0", "add dword ptr [@ax+4*@si], eax"); - TEST64("\x67\x01\x04\xb0", "add dword ptr [eax+4*esi], eax"); - TEST("\x01\x04\xb1", "add dword ptr [@cx+4*@si], eax"); - TEST64("\x67\x01\x04\xb1", "add dword ptr [ecx+4*esi], eax"); - TEST("\x01\x04\xb2", "add dword ptr [@dx+4*@si], eax"); - TEST64("\x67\x01\x04\xb2", "add dword ptr [edx+4*esi], eax"); - TEST("\x01\x04\xb3", "add dword ptr [@bx+4*@si], eax"); - TEST64("\x67\x01\x04\xb3", "add dword ptr [ebx+4*esi], eax"); - TEST("\x01\x04\xb4", "add dword ptr [@sp+4*@si], eax"); - TEST64("\x67\x01\x04\xb4", "add dword ptr [esp+4*esi], eax"); - TEST("\x01\x04\xb5\x11\x22\x33\x44", "add dword ptr [4*@si+0x44332211], eax"); - TEST64("\x67\x01\x04\xb5\x11\x22\x33\x44", "add dword ptr [4*esi+0x44332211], eax"); - TEST("\x01\x04\xb6", "add dword ptr [@si+4*@si], eax"); - TEST64("\x67\x01\x04\xb6", "add dword ptr [esi+4*esi], eax"); - TEST("\x01\x04\xb7", "add dword ptr [@di+4*@si], eax"); - TEST64("\x67\x01\x04\xb7", "add dword ptr [edi+4*esi], eax"); - TEST("\x01\x04\xb8", "add dword ptr [@ax+4*@di], eax"); - TEST64("\x67\x01\x04\xb8", "add dword ptr [eax+4*edi], eax"); - TEST("\x01\x04\xb9", "add dword ptr [@cx+4*@di], eax"); - TEST64("\x67\x01\x04\xb9", "add dword ptr [ecx+4*edi], eax"); - TEST("\x01\x04\xba", "add dword ptr [@dx+4*@di], eax"); - TEST64("\x67\x01\x04\xba", "add dword ptr [edx+4*edi], eax"); - TEST("\x01\x04\xbb", "add dword ptr [@bx+4*@di], eax"); - TEST64("\x67\x01\x04\xbb", "add dword ptr [ebx+4*edi], eax"); - TEST("\x01\x04\xbc", "add dword ptr [@sp+4*@di], eax"); - TEST64("\x67\x01\x04\xbc", "add dword ptr [esp+4*edi], eax"); - TEST("\x01\x04\xbd\x11\x22\x33\x44", "add dword ptr [4*@di+0x44332211], eax"); - TEST64("\x67\x01\x04\xbd\x11\x22\x33\x44", "add dword ptr [4*edi+0x44332211], eax"); - TEST("\x01\x04\xbe", "add dword ptr [@si+4*@di], eax"); - TEST64("\x67\x01\x04\xbe", "add dword ptr [esi+4*edi], eax"); - TEST("\x01\x04\xbf", "add dword ptr [@di+4*@di], eax"); - TEST64("\x67\x01\x04\xbf", "add dword ptr [edi+4*edi], eax"); - TEST3264("\x01\x05\x11\x22\x33\x44", "add dword ptr [0x44332211], eax", "add dword ptr [rip+0x44332211], eax"); - TEST64("\x67\x01\x05\x11\x22\x33\x44", "add dword ptr [eip+0x44332211], eax"); - TEST("\x01\x06", "add dword ptr [@si], eax"); - TEST64("\x67\x01\x06", "add dword ptr [esi], eax"); - TEST("\x01\x07", "add dword ptr [@di], eax"); - TEST64("\x67\x01\x07", "add dword ptr [edi], eax"); - TEST("\x01\x40\x99", "add dword ptr [@ax-0x67], eax"); - TEST64("\x67\x01\x40\x99", "add dword ptr [eax-0x67], eax"); - TEST("\x01\x41\x99", "add dword ptr [@cx-0x67], eax"); - TEST64("\x67\x01\x41\x99", "add dword ptr [ecx-0x67], eax"); - TEST("\x01\x42\x99", "add dword ptr [@dx-0x67], eax"); - TEST64("\x67\x01\x42\x99", "add dword ptr [edx-0x67], eax"); - TEST("\x01\x43\x99", "add dword ptr [@bx-0x67], eax"); - TEST64("\x67\x01\x43\x99", "add dword ptr [ebx-0x67], eax"); - TEST("\x01\x44\x80\x99", "add dword ptr [@ax+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x80\x99", "add dword ptr [eax+4*eax-0x67], eax"); - TEST("\x01\x44\x81\x99", "add dword ptr [@cx+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x81\x99", "add dword ptr [ecx+4*eax-0x67], eax"); - TEST("\x01\x44\x82\x99", "add dword ptr [@dx+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x82\x99", "add dword ptr [edx+4*eax-0x67], eax"); - TEST("\x01\x44\x83\x99", "add dword ptr [@bx+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x83\x99", "add dword ptr [ebx+4*eax-0x67], eax"); - TEST("\x01\x44\x84\x99", "add dword ptr [@sp+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x84\x99", "add dword ptr [esp+4*eax-0x67], eax"); - TEST("\x01\x44\x85\x99", "add dword ptr [@bp+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x85\x99", "add dword ptr [ebp+4*eax-0x67], eax"); - TEST("\x01\x44\x86\x99", "add dword ptr [@si+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x86\x99", "add dword ptr [esi+4*eax-0x67], eax"); - TEST("\x01\x44\x87\x99", "add dword ptr [@di+4*@ax-0x67], eax"); - TEST64("\x67\x01\x44\x87\x99", "add dword ptr [edi+4*eax-0x67], eax"); - TEST("\x01\x44\x88\x99", "add dword ptr [@ax+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x88\x99", "add dword ptr [eax+4*ecx-0x67], eax"); - TEST("\x01\x44\x89\x99", "add dword ptr [@cx+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x89\x99", "add dword ptr [ecx+4*ecx-0x67], eax"); - TEST("\x01\x44\x8a\x99", "add dword ptr [@dx+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8a\x99", "add dword ptr [edx+4*ecx-0x67], eax"); - TEST("\x01\x44\x8b\x99", "add dword ptr [@bx+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8b\x99", "add dword ptr [ebx+4*ecx-0x67], eax"); - TEST("\x01\x44\x8c\x99", "add dword ptr [@sp+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8c\x99", "add dword ptr [esp+4*ecx-0x67], eax"); - TEST("\x01\x44\x8d\x99", "add dword ptr [@bp+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8d\x99", "add dword ptr [ebp+4*ecx-0x67], eax"); - TEST("\x01\x44\x8e\x99", "add dword ptr [@si+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8e\x99", "add dword ptr [esi+4*ecx-0x67], eax"); - TEST("\x01\x44\x8f\x99", "add dword ptr [@di+4*@cx-0x67], eax"); - TEST64("\x67\x01\x44\x8f\x99", "add dword ptr [edi+4*ecx-0x67], eax"); - TEST("\x01\x44\x90\x99", "add dword ptr [@ax+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x90\x99", "add dword ptr [eax+4*edx-0x67], eax"); - TEST("\x01\x44\x91\x99", "add dword ptr [@cx+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x91\x99", "add dword ptr [ecx+4*edx-0x67], eax"); - TEST("\x01\x44\x92\x99", "add dword ptr [@dx+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x92\x99", "add dword ptr [edx+4*edx-0x67], eax"); - TEST("\x01\x44\x93\x99", "add dword ptr [@bx+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x93\x99", "add dword ptr [ebx+4*edx-0x67], eax"); - TEST("\x01\x44\x94\x99", "add dword ptr [@sp+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x94\x99", "add dword ptr [esp+4*edx-0x67], eax"); - TEST("\x01\x44\x95\x99", "add dword ptr [@bp+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x95\x99", "add dword ptr [ebp+4*edx-0x67], eax"); - TEST("\x01\x44\x96\x99", "add dword ptr [@si+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x96\x99", "add dword ptr [esi+4*edx-0x67], eax"); - TEST("\x01\x44\x97\x99", "add dword ptr [@di+4*@dx-0x67], eax"); - TEST64("\x67\x01\x44\x97\x99", "add dword ptr [edi+4*edx-0x67], eax"); - TEST("\x01\x44\x98\x99", "add dword ptr [@ax+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x98\x99", "add dword ptr [eax+4*ebx-0x67], eax"); - TEST("\x01\x44\x99\x99", "add dword ptr [@cx+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x99\x99", "add dword ptr [ecx+4*ebx-0x67], eax"); - TEST("\x01\x44\x9a\x99", "add dword ptr [@dx+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9a\x99", "add dword ptr [edx+4*ebx-0x67], eax"); - TEST("\x01\x44\x9b\x99", "add dword ptr [@bx+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9b\x99", "add dword ptr [ebx+4*ebx-0x67], eax"); - TEST("\x01\x44\x9c\x99", "add dword ptr [@sp+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9c\x99", "add dword ptr [esp+4*ebx-0x67], eax"); - TEST("\x01\x44\x9d\x99", "add dword ptr [@bp+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9d\x99", "add dword ptr [ebp+4*ebx-0x67], eax"); - TEST("\x01\x44\x9e\x99", "add dword ptr [@si+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9e\x99", "add dword ptr [esi+4*ebx-0x67], eax"); - TEST("\x01\x44\x9f\x99", "add dword ptr [@di+4*@bx-0x67], eax"); - TEST64("\x67\x01\x44\x9f\x99", "add dword ptr [edi+4*ebx-0x67], eax"); - TEST("\x01\x44\xa0\x99", "add dword ptr [@ax-0x67], eax"); - TEST64("\x67\x01\x44\xa0\x99", "add dword ptr [eax-0x67], eax"); - TEST("\x01\x44\xa1\x99", "add dword ptr [@cx-0x67], eax"); - TEST64("\x67\x01\x44\xa1\x99", "add dword ptr [ecx-0x67], eax"); - TEST("\x01\x44\xa2\x99", "add dword ptr [@dx-0x67], eax"); - TEST64("\x67\x01\x44\xa2\x99", "add dword ptr [edx-0x67], eax"); - TEST("\x01\x44\xa3\x99", "add dword ptr [@bx-0x67], eax"); - TEST64("\x67\x01\x44\xa3\x99", "add dword ptr [ebx-0x67], eax"); - TEST("\x01\x44\xa4\x99", "add dword ptr [@sp-0x67], eax"); - TEST64("\x67\x01\x44\xa4\x99", "add dword ptr [esp-0x67], eax"); - TEST("\x01\x44\xa5\x99", "add dword ptr [@bp-0x67], eax"); - TEST64("\x67\x01\x44\xa5\x99", "add dword ptr [ebp-0x67], eax"); - TEST("\x01\x44\xa6\x99", "add dword ptr [@si-0x67], eax"); - TEST64("\x67\x01\x44\xa6\x99", "add dword ptr [esi-0x67], eax"); - TEST("\x01\x44\xa7\x99", "add dword ptr [@di-0x67], eax"); - TEST64("\x67\x01\x44\xa7\x99", "add dword ptr [edi-0x67], eax"); - TEST("\x01\x44\xa8\x99", "add dword ptr [@ax+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xa8\x99", "add dword ptr [eax+4*ebp-0x67], eax"); - TEST("\x01\x44\xa9\x99", "add dword ptr [@cx+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xa9\x99", "add dword ptr [ecx+4*ebp-0x67], eax"); - TEST("\x01\x44\xaa\x99", "add dword ptr [@dx+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xaa\x99", "add dword ptr [edx+4*ebp-0x67], eax"); - TEST("\x01\x44\xab\x99", "add dword ptr [@bx+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xab\x99", "add dword ptr [ebx+4*ebp-0x67], eax"); - TEST("\x01\x44\xac\x99", "add dword ptr [@sp+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xac\x99", "add dword ptr [esp+4*ebp-0x67], eax"); - TEST("\x01\x44\xad\x99", "add dword ptr [@bp+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xad\x99", "add dword ptr [ebp+4*ebp-0x67], eax"); - TEST("\x01\x44\xae\x99", "add dword ptr [@si+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xae\x99", "add dword ptr [esi+4*ebp-0x67], eax"); - TEST("\x01\x44\xaf\x99", "add dword ptr [@di+4*@bp-0x67], eax"); - TEST64("\x67\x01\x44\xaf\x99", "add dword ptr [edi+4*ebp-0x67], eax"); - TEST("\x01\x44\xb0\x99", "add dword ptr [@ax+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb0\x99", "add dword ptr [eax+4*esi-0x67], eax"); - TEST("\x01\x44\xb1\x99", "add dword ptr [@cx+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb1\x99", "add dword ptr [ecx+4*esi-0x67], eax"); - TEST("\x01\x44\xb2\x99", "add dword ptr [@dx+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb2\x99", "add dword ptr [edx+4*esi-0x67], eax"); - TEST("\x01\x44\xb3\x99", "add dword ptr [@bx+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb3\x99", "add dword ptr [ebx+4*esi-0x67], eax"); - TEST("\x01\x44\xb4\x99", "add dword ptr [@sp+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb4\x99", "add dword ptr [esp+4*esi-0x67], eax"); - TEST("\x01\x44\xb5\x99", "add dword ptr [@bp+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb5\x99", "add dword ptr [ebp+4*esi-0x67], eax"); - TEST("\x01\x44\xb6\x99", "add dword ptr [@si+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb6\x99", "add dword ptr [esi+4*esi-0x67], eax"); - TEST("\x01\x44\xb7\x99", "add dword ptr [@di+4*@si-0x67], eax"); - TEST64("\x67\x01\x44\xb7\x99", "add dword ptr [edi+4*esi-0x67], eax"); - TEST("\x01\x44\xb8\x99", "add dword ptr [@ax+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xb8\x99", "add dword ptr [eax+4*edi-0x67], eax"); - TEST("\x01\x44\xb9\x99", "add dword ptr [@cx+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xb9\x99", "add dword ptr [ecx+4*edi-0x67], eax"); - TEST("\x01\x44\xba\x99", "add dword ptr [@dx+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xba\x99", "add dword ptr [edx+4*edi-0x67], eax"); - TEST("\x01\x44\xbb\x99", "add dword ptr [@bx+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xbb\x99", "add dword ptr [ebx+4*edi-0x67], eax"); - TEST("\x01\x44\xbc\x99", "add dword ptr [@sp+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xbc\x99", "add dword ptr [esp+4*edi-0x67], eax"); - TEST("\x01\x44\xbd\x99", "add dword ptr [@bp+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xbd\x99", "add dword ptr [ebp+4*edi-0x67], eax"); - TEST("\x01\x44\xbe\x99", "add dword ptr [@si+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xbe\x99", "add dword ptr [esi+4*edi-0x67], eax"); - TEST("\x01\x44\xbf\x99", "add dword ptr [@di+4*@di-0x67], eax"); - TEST64("\x67\x01\x44\xbf\x99", "add dword ptr [edi+4*edi-0x67], eax"); - TEST("\x01\x45\x99", "add dword ptr [@bp-0x67], eax"); - TEST64("\x67\x01\x45\x99", "add dword ptr [ebp-0x67], eax"); - TEST("\x01\x46\x99", "add dword ptr [@si-0x67], eax"); - TEST64("\x67\x01\x46\x99", "add dword ptr [esi-0x67], eax"); - TEST("\x01\x47\x99", "add dword ptr [@di-0x67], eax"); - TEST64("\x67\x01\x47\x99", "add dword ptr [edi-0x67], eax"); - TEST("\x01\x80\x11\x22\x33\x44", "add dword ptr [@ax+0x44332211], eax"); - TEST64("\x67\x01\x80\x11\x22\x33\x44", "add dword ptr [eax+0x44332211], eax"); - TEST("\x01\x81\x11\x22\x33\x44", "add dword ptr [@cx+0x44332211], eax"); - TEST64("\x67\x01\x81\x11\x22\x33\x44", "add dword ptr [ecx+0x44332211], eax"); - TEST("\x01\x82\x11\x22\x33\x44", "add dword ptr [@dx+0x44332211], eax"); - TEST64("\x67\x01\x82\x11\x22\x33\x44", "add dword ptr [edx+0x44332211], eax"); - TEST("\x01\x83\x11\x22\x33\x44", "add dword ptr [@bx+0x44332211], eax"); - TEST64("\x67\x01\x83\x11\x22\x33\x44", "add dword ptr [ebx+0x44332211], eax"); - TEST("\x01\x84\x80\x11\x22\x33\x44", "add dword ptr [@ax+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x80\x11\x22\x33\x44", "add dword ptr [eax+4*eax+0x44332211], eax"); - TEST("\x01\x84\x81\x11\x22\x33\x44", "add dword ptr [@cx+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x81\x11\x22\x33\x44", "add dword ptr [ecx+4*eax+0x44332211], eax"); - TEST("\x01\x84\x82\x11\x22\x33\x44", "add dword ptr [@dx+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x82\x11\x22\x33\x44", "add dword ptr [edx+4*eax+0x44332211], eax"); - TEST("\x01\x84\x83\x11\x22\x33\x44", "add dword ptr [@bx+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x83\x11\x22\x33\x44", "add dword ptr [ebx+4*eax+0x44332211], eax"); - TEST("\x01\x84\x84\x11\x22\x33\x44", "add dword ptr [@sp+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x84\x11\x22\x33\x44", "add dword ptr [esp+4*eax+0x44332211], eax"); - TEST("\x01\x84\x85\x11\x22\x33\x44", "add dword ptr [@bp+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x85\x11\x22\x33\x44", "add dword ptr [ebp+4*eax+0x44332211], eax"); - TEST("\x01\x84\x86\x11\x22\x33\x44", "add dword ptr [@si+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x86\x11\x22\x33\x44", "add dword ptr [esi+4*eax+0x44332211], eax"); - TEST("\x01\x84\x87\x11\x22\x33\x44", "add dword ptr [@di+4*@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\x87\x11\x22\x33\x44", "add dword ptr [edi+4*eax+0x44332211], eax"); - TEST("\x01\x84\x88\x11\x22\x33\x44", "add dword ptr [@ax+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x88\x11\x22\x33\x44", "add dword ptr [eax+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x89\x11\x22\x33\x44", "add dword ptr [@cx+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x89\x11\x22\x33\x44", "add dword ptr [ecx+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8a\x11\x22\x33\x44", "add dword ptr [@dx+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8a\x11\x22\x33\x44", "add dword ptr [edx+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8b\x11\x22\x33\x44", "add dword ptr [@bx+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8b\x11\x22\x33\x44", "add dword ptr [ebx+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8c\x11\x22\x33\x44", "add dword ptr [@sp+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8c\x11\x22\x33\x44", "add dword ptr [esp+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8d\x11\x22\x33\x44", "add dword ptr [@bp+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8d\x11\x22\x33\x44", "add dword ptr [ebp+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8e\x11\x22\x33\x44", "add dword ptr [@si+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8e\x11\x22\x33\x44", "add dword ptr [esi+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x8f\x11\x22\x33\x44", "add dword ptr [@di+4*@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\x8f\x11\x22\x33\x44", "add dword ptr [edi+4*ecx+0x44332211], eax"); - TEST("\x01\x84\x90\x11\x22\x33\x44", "add dword ptr [@ax+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x90\x11\x22\x33\x44", "add dword ptr [eax+4*edx+0x44332211], eax"); - TEST("\x01\x84\x91\x11\x22\x33\x44", "add dword ptr [@cx+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x91\x11\x22\x33\x44", "add dword ptr [ecx+4*edx+0x44332211], eax"); - TEST("\x01\x84\x92\x11\x22\x33\x44", "add dword ptr [@dx+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x92\x11\x22\x33\x44", "add dword ptr [edx+4*edx+0x44332211], eax"); - TEST("\x01\x84\x93\x11\x22\x33\x44", "add dword ptr [@bx+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x93\x11\x22\x33\x44", "add dword ptr [ebx+4*edx+0x44332211], eax"); - TEST("\x01\x84\x94\x11\x22\x33\x44", "add dword ptr [@sp+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x94\x11\x22\x33\x44", "add dword ptr [esp+4*edx+0x44332211], eax"); - TEST("\x01\x84\x95\x11\x22\x33\x44", "add dword ptr [@bp+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x95\x11\x22\x33\x44", "add dword ptr [ebp+4*edx+0x44332211], eax"); - TEST("\x01\x84\x96\x11\x22\x33\x44", "add dword ptr [@si+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x96\x11\x22\x33\x44", "add dword ptr [esi+4*edx+0x44332211], eax"); - TEST("\x01\x84\x97\x11\x22\x33\x44", "add dword ptr [@di+4*@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\x97\x11\x22\x33\x44", "add dword ptr [edi+4*edx+0x44332211], eax"); - TEST("\x01\x84\x98\x11\x22\x33\x44", "add dword ptr [@ax+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x98\x11\x22\x33\x44", "add dword ptr [eax+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x99\x11\x22\x33\x44", "add dword ptr [@cx+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x99\x11\x22\x33\x44", "add dword ptr [ecx+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9a\x11\x22\x33\x44", "add dword ptr [@dx+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9a\x11\x22\x33\x44", "add dword ptr [edx+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9b\x11\x22\x33\x44", "add dword ptr [@bx+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9b\x11\x22\x33\x44", "add dword ptr [ebx+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9c\x11\x22\x33\x44", "add dword ptr [@sp+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9c\x11\x22\x33\x44", "add dword ptr [esp+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9d\x11\x22\x33\x44", "add dword ptr [@bp+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9d\x11\x22\x33\x44", "add dword ptr [ebp+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9e\x11\x22\x33\x44", "add dword ptr [@si+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9e\x11\x22\x33\x44", "add dword ptr [esi+4*ebx+0x44332211], eax"); - TEST("\x01\x84\x9f\x11\x22\x33\x44", "add dword ptr [@di+4*@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\x9f\x11\x22\x33\x44", "add dword ptr [edi+4*ebx+0x44332211], eax"); - TEST("\x01\x84\xa0\x11\x22\x33\x44", "add dword ptr [@ax+0x44332211], eax"); - TEST64("\x67\x01\x84\xa0\x11\x22\x33\x44", "add dword ptr [eax+0x44332211], eax"); - TEST("\x01\x84\xa1\x11\x22\x33\x44", "add dword ptr [@cx+0x44332211], eax"); - TEST64("\x67\x01\x84\xa1\x11\x22\x33\x44", "add dword ptr [ecx+0x44332211], eax"); - TEST("\x01\x84\xa2\x11\x22\x33\x44", "add dword ptr [@dx+0x44332211], eax"); - TEST64("\x67\x01\x84\xa2\x11\x22\x33\x44", "add dword ptr [edx+0x44332211], eax"); - TEST("\x01\x84\xa3\x11\x22\x33\x44", "add dword ptr [@bx+0x44332211], eax"); - TEST64("\x67\x01\x84\xa3\x11\x22\x33\x44", "add dword ptr [ebx+0x44332211], eax"); - TEST("\x01\x84\xa4\x11\x22\x33\x44", "add dword ptr [@sp+0x44332211], eax"); - TEST64("\x67\x01\x84\xa4\x11\x22\x33\x44", "add dword ptr [esp+0x44332211], eax"); - TEST("\x01\x84\xa5\x11\x22\x33\x44", "add dword ptr [@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xa5\x11\x22\x33\x44", "add dword ptr [ebp+0x44332211], eax"); - TEST("\x01\x84\xa6\x11\x22\x33\x44", "add dword ptr [@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xa6\x11\x22\x33\x44", "add dword ptr [esi+0x44332211], eax"); - TEST("\x01\x84\xa7\x11\x22\x33\x44", "add dword ptr [@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xa7\x11\x22\x33\x44", "add dword ptr [edi+0x44332211], eax"); - TEST("\x01\x84\xa8\x11\x22\x33\x44", "add dword ptr [@ax+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xa8\x11\x22\x33\x44", "add dword ptr [eax+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xa9\x11\x22\x33\x44", "add dword ptr [@cx+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xa9\x11\x22\x33\x44", "add dword ptr [ecx+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xaa\x11\x22\x33\x44", "add dword ptr [@dx+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xaa\x11\x22\x33\x44", "add dword ptr [edx+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xab\x11\x22\x33\x44", "add dword ptr [@bx+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xab\x11\x22\x33\x44", "add dword ptr [ebx+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xac\x11\x22\x33\x44", "add dword ptr [@sp+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xac\x11\x22\x33\x44", "add dword ptr [esp+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xad\x11\x22\x33\x44", "add dword ptr [@bp+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xad\x11\x22\x33\x44", "add dword ptr [ebp+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xae\x11\x22\x33\x44", "add dword ptr [@si+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xae\x11\x22\x33\x44", "add dword ptr [esi+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xaf\x11\x22\x33\x44", "add dword ptr [@di+4*@bp+0x44332211], eax"); - TEST64("\x67\x01\x84\xaf\x11\x22\x33\x44", "add dword ptr [edi+4*ebp+0x44332211], eax"); - TEST("\x01\x84\xb0\x11\x22\x33\x44", "add dword ptr [@ax+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb0\x11\x22\x33\x44", "add dword ptr [eax+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb1\x11\x22\x33\x44", "add dword ptr [@cx+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb1\x11\x22\x33\x44", "add dword ptr [ecx+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb2\x11\x22\x33\x44", "add dword ptr [@dx+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb2\x11\x22\x33\x44", "add dword ptr [edx+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb3\x11\x22\x33\x44", "add dword ptr [@bx+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb3\x11\x22\x33\x44", "add dword ptr [ebx+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb4\x11\x22\x33\x44", "add dword ptr [@sp+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb4\x11\x22\x33\x44", "add dword ptr [esp+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb5\x11\x22\x33\x44", "add dword ptr [@bp+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb5\x11\x22\x33\x44", "add dword ptr [ebp+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb6\x11\x22\x33\x44", "add dword ptr [@si+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb6\x11\x22\x33\x44", "add dword ptr [esi+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb7\x11\x22\x33\x44", "add dword ptr [@di+4*@si+0x44332211], eax"); - TEST64("\x67\x01\x84\xb7\x11\x22\x33\x44", "add dword ptr [edi+4*esi+0x44332211], eax"); - TEST("\x01\x84\xb8\x11\x22\x33\x44", "add dword ptr [@ax+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xb8\x11\x22\x33\x44", "add dword ptr [eax+4*edi+0x44332211], eax"); - TEST("\x01\x84\xb9\x11\x22\x33\x44", "add dword ptr [@cx+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xb9\x11\x22\x33\x44", "add dword ptr [ecx+4*edi+0x44332211], eax"); - TEST("\x01\x84\xba\x11\x22\x33\x44", "add dword ptr [@dx+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xba\x11\x22\x33\x44", "add dword ptr [edx+4*edi+0x44332211], eax"); - TEST("\x01\x84\xbb\x11\x22\x33\x44", "add dword ptr [@bx+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xbb\x11\x22\x33\x44", "add dword ptr [ebx+4*edi+0x44332211], eax"); - TEST("\x01\x84\xbc\x11\x22\x33\x44", "add dword ptr [@sp+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xbc\x11\x22\x33\x44", "add dword ptr [esp+4*edi+0x44332211], eax"); - TEST("\x01\x84\xbd\x11\x22\x33\x44", "add dword ptr [@bp+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xbd\x11\x22\x33\x44", "add dword ptr [ebp+4*edi+0x44332211], eax"); - TEST("\x01\x84\xbe\x11\x22\x33\x44", "add dword ptr [@si+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xbe\x11\x22\x33\x44", "add dword ptr [esi+4*edi+0x44332211], eax"); - TEST("\x01\x84\xbf\x11\x22\x33\x44", "add dword ptr [@di+4*@di+0x44332211], eax"); - TEST64("\x67\x01\x84\xbf\x11\x22\x33\x44", "add dword ptr [edi+4*edi+0x44332211], eax"); - TEST("\x01\x85\x11\x22\x33\x44", "add dword ptr [@bp+0x44332211], eax"); - TEST64("\x67\x01\x85\x11\x22\x33\x44", "add dword ptr [ebp+0x44332211], eax"); - TEST("\x01\x86\x11\x22\x33\x44", "add dword ptr [@si+0x44332211], eax"); - TEST64("\x67\x01\x86\x11\x22\x33\x44", "add dword ptr [esi+0x44332211], eax"); - TEST("\x01\x87\x11\x22\x33\x44", "add dword ptr [@di+0x44332211], eax"); - TEST64("\x67\x01\x87\x11\x22\x33\x44", "add dword ptr [edi+0x44332211], eax"); - TEST("\x01\xc0", "add eax, eax"); - TEST("\x01\xc1", "add ecx, eax"); - TEST("\x01\xc2", "add edx, eax"); - TEST("\x01\xc3", "add ebx, eax"); - TEST("\x01\xc4", "add esp, eax"); - TEST("\x01\xc5", "add ebp, eax"); - TEST("\x01\xc6", "add esi, eax"); - TEST("\x01\xc7", "add edi, eax"); - - TEST("\x0f\xbc\xc0", "bsf eax, eax"); - TEST("\x66\x0f\xbc\xc0", "bsf ax, ax"); - TEST("\xf2\x0f\xbc\xc0", "bsf eax, eax"); - TEST("\x66\xf2\x0f\xbc\xc0", "bsf ax, ax"); - TEST("\x0f\x01\x00", "sgdt [@ax]"); - TEST("\x66\x0f\x01\x00", "sgdt [@ax]"); - TEST("\xf2\x0f\x01\x00", "sgdt [@ax]"); - TEST("\xf3\x0f\x01\x00", "sgdt [@ax]"); - TEST("\x04\x01", "add al, 0x1"); - TEST("\x66\x50", "push ax"); - TEST("\x50", "push @ax"); - TEST("\x66\x68\xff\xad", "pushw 0xadff"); - TEST3264("\x68\xff\xad\x90\xbc", "push 0xbc90adff", "push 0xffffffffbc90adff"); - TEST("\x66\x6a\xff", "pushw 0xffff"); - TEST3264("\x6a\xff", "push 0xffffffff", "push 0xffffffffffffffff"); - TEST32("\x60", "pushad"); - TEST32("\x66\x60", "pushaw"); - TEST("\xb0\xf0", "mov al, 0xf0"); - TEST("\xb1\xda", "mov cl, 0xda"); - TEST("\xb2\xff", "mov dl, 0xff"); - TEST("\xb3\x8d", "mov bl, 0x8d"); - TEST("\xb4\x5e", "mov ah, 0x5e"); - TEST64("\x40\xb4\x00", "mov spl, 0x0"); - TEST("\xb5\x74", "mov ch, 0x74"); - TEST64("\x40\xb5\xd0", "mov bpl, 0xd0"); - TEST("\xb6\xe5", "mov dh, 0xe5"); - TEST64("\x40\xb6\xf1", "mov sil, 0xf1"); - TEST("\xb7\xe8", "mov bh, 0xe8"); - TEST64("\x40\xb7\x31", "mov dil, 0x31"); - TEST("\x66\xb8\xf0\xf0", "mov ax, 0xf0f0"); - TEST("\xb8\xf0\xf0\xab\xff", "mov eax, 0xffabf0f0"); - TEST64("\x48\xb8\xf0\xf0\xab\xff\x00\x12\x12\xcd", "mov rax, 0xcd121200ffabf0f0"); - TEST64("\xcd\x80", "int 0x80"); - - // Test FD/TD encoding - TEST32("\xa0\x44\x33\x22\x11", "mov al, byte ptr [0x11223344]"); - TEST64("\xa0\x88\x77\x66\x55\x44\x33\x22\x11", "mov al, byte ptr [0x1122334455667788]"); - TEST32("\x67\xa0\x22\x11", "mov al, byte ptr [0x1122]"); - TEST64("\x67\xa0\x44\x33\x22\x11", "mov al, byte ptr [0x11223344]"); - TEST32("\xa1\x44\x33\x22\x11", "mov eax, dword ptr [0x11223344]"); - TEST64("\xa1\x88\x77\x66\x55\x44\x33\x22\x11", "mov eax, dword ptr [0x1122334455667788]"); - TEST32("\x67\xa1\x22\x11", "mov eax, dword ptr [0x1122]"); - TEST64("\x67\xa1\x44\x33\x22\x11", "mov eax, dword ptr [0x11223344]"); - TEST32("\x66\xa1\x44\x33\x22\x11", "mov ax, word ptr [0x11223344]"); - TEST64("\x66\xa1\x88\x77\x66\x55\x44\x33\x22\x11", "mov ax, word ptr [0x1122334455667788]"); - TEST32("\x66\x67\xa1\x22\x11", "mov ax, word ptr [0x1122]"); - TEST64("\x66\x67\xa1\x44\x33\x22\x11", "mov ax, word ptr [0x11223344]"); - TEST64("\x48\xa1\x88\x77\x66\x55\x44\x33\x22\x11", "mov rax, qword ptr [0x1122334455667788]"); - TEST64("\x67\x48\xa1\x44\x33\x22\x11", "mov rax, qword ptr [0x11223344]"); - TEST32("\xa2\x44\x33\x22\x11", "mov byte ptr [0x11223344], al"); - TEST64("\xa2\x88\x77\x66\x55\x44\x33\x22\x11", "mov byte ptr [0x1122334455667788], al"); - TEST32("\x67\xa2\x22\x11", "mov byte ptr [0x1122], al"); - TEST64("\x67\xa2\x44\x33\x22\x11", "mov byte ptr [0x11223344], al"); - TEST32("\xa3\x44\x33\x22\x11", "mov dword ptr [0x11223344], eax"); - TEST64("\xa3\x88\x77\x66\x55\x44\x33\x22\x11", "mov dword ptr [0x1122334455667788], eax"); - TEST32("\x67\xa3\x22\x11", "mov dword ptr [0x1122], eax"); - TEST64("\x67\xa3\x44\x33\x22\x11", "mov dword ptr [0x11223344], eax"); - TEST32("\x66\xa3\x44\x33\x22\x11", "mov word ptr [0x11223344], ax"); - TEST64("\x66\xa3\x88\x77\x66\x55\x44\x33\x22\x11", "mov word ptr [0x1122334455667788], ax"); - TEST32("\x66\x67\xa3\x22\x11", "mov word ptr [0x1122], ax"); - TEST64("\x66\x67\xa3\x44\x33\x22\x11", "mov word ptr [0x11223344], ax"); - TEST64("\x48\xa3\x88\x77\x66\x55\x44\x33\x22\x11", "mov qword ptr [0x1122334455667788], rax"); - TEST64("\x67\x48\xa3\x44\x33\x22\x11", "mov qword ptr [0x11223344], rax"); - TEST32("\xa0\x44\x33\x22", "PARTIAL"); - TEST64("\xa0\x88\x77\x66\x55\x44\x33\x22", "PARTIAL"); - TEST32("\x67\xa0\x22", "PARTIAL"); - TEST64("\x67\xa0\x44\x33\x22", "PARTIAL"); - - TEST("\x66\xc8\x00\x00\x00", "enterw 0x0, 0x0"); - TEST("\x66\xc8\x00\x0f\x00", "enterw 0xf00, 0x0"); - TEST("\x66\xc8\x00\x00\x01", "enterw 0x0, 0x1"); - TEST32("\xc8\x00\x00\x00", "enter 0x0, 0x0"); - TEST32("\xc8\x00\x0f\x00", "enter 0xf00, 0x0"); - TEST32("\xc8\x00\x00\x01", "enter 0x0, 0x1"); - TEST64("\xc8\x00\x00\x00", "enter 0x0, 0x0"); - TEST64("\xc8\x00\x0f\x00", "enter 0xf00, 0x0"); - TEST64("\xc8\x00\x00\x01", "enter 0x0, 0x1"); - - TEST64("\xd3\xe0", "shl eax, cl"); - TEST64("\xd0\x3e", "sar byte ptr [rsi], 0x1"); - TEST64("\x0f\xa5\xd0", "shld eax, edx, cl"); - - TEST("\x69\xC7\x08\x01\x00\x00", "imul eax, edi, 0x108"); - TEST("\x6B\xC7\x08", "imul eax, edi, 0x8"); - TEST("\x6B\xC7\xff", "imul eax, edi, 0xffffffff"); - - TEST("\x0f\x38\xf0\xd1", "UD"); // MOVBE doesn't allow register moves - TEST("\x0f\x38\xf0\x11", "movbe edx, dword ptr [@cx]"); - TEST("\x66\x0f\x38\xf0\x11", "movbe dx, word ptr [@cx]"); - TEST64("\x48\x0f\x38\xf0\x01", "movbe rax, qword ptr [rcx]"); - TEST("\xf2\x0f\x38\xf0\xd1", "crc32 edx, cl"); - TEST("\xf2\x66\x0f\x38\xf1\xd1", "crc32 edx, cx"); - TEST("\xf2\x0f\x38\xf1\xd1", "crc32 edx, ecx"); - TEST64("\xf2\x48\x0f\x38\xf1\xd1", "crc32 edx, rcx"); - TEST64("\xf2\x4c\x0f\x38\xf1\xd1", "crc32 r10d, rcx"); - - TEST("\x8d\x00", "lea eax, [@ax]"); - TEST("\x8d\xc0", "UD"); - - TEST("\x00\xc0", "add al, al"); - TEST("\x00\xc1", "add cl, al"); - TEST("\x00\xd0", "add al, dl"); - TEST("\x00\xff", "add bh, bh"); - TEST("\x01\xc0", "add eax, eax"); - TEST("\x01\xc1", "add ecx, eax"); - TEST("\x01\xd0", "add eax, edx"); - TEST("\x01\xff", "add edi, edi"); - TEST("\x02\xc0", "add al, al"); - TEST("\x02\xc1", "add al, cl"); - TEST("\x02\xd0", "add dl, al"); - TEST("\x02\xff", "add bh, bh"); - TEST("\x03\xc0", "add eax, eax"); - TEST("\x03\xc1", "add eax, ecx"); - TEST("\x03\xd0", "add edx, eax"); - TEST("\x03\xff", "add edi, edi"); - TEST("\x05\x01\x00\x00\x80", "add eax, 0x80000001"); - TEST64("\x48\x05\x01\x00\x00\x80", "add rax, 0xffffffff80000001"); - - TEST32("\x40", "inc eax"); - TEST32("\x43", "inc ebx"); - TEST32("\x66\x47", "inc di"); - TEST("\xfe\xc0", "inc al"); - TEST("\xfe\xc4", "inc ah"); - TEST("\xff\xc0", "inc eax"); - TEST("\xff\xc4", "inc esp"); - TEST("\xff\x00", "inc dword ptr [@ax]"); - TEST("\xf0\xff\x00", "lock inc dword ptr [@ax]"); - TEST("\x66\xff\xc0", "inc ax"); - TEST("\x66\xff\xc4", "inc sp"); - TEST64("\x48\xff\xc0", "inc rax"); - TEST64("\x48\xff\xc4", "inc rsp"); - TEST64("\x49\xff\xc7", "inc r15"); - - TEST32("\xe9\x00\x00\x00\x00", "jmp 0x5"); - TEST32("\x66\xe9\x01\x00", "jmpw 0x5"); - TEST64("\xe9\x00\x00\x00\x00", "jmp 0x5"); - TEST64("\x66\xe9\x00\x00\x00\x00", "jmp 0x6"); - TEST64("\x66\xeb\x00", "jmp 0x3"); - TEST64("\x66\xeb\xff", "jmp 0x2"); - TEST("\x66\xe9\x00", "PARTIAL"); - TEST("\x66\xe9", "PARTIAL"); - TEST32("\xc7\xf8\xd3\x9c\xff\xff", "xbegin 0xffff9cd9"); - TEST32("\x66\xc7\xf8\xd3\x9c", "xbegin 0xffff9cd8"); - TEST64("\xc7\xf8\xd3\x9c\xff\xff", "xbegin 0xffffffffffff9cd9"); - TEST64("\x66\xc7\xf8\xd3\x9c", "xbegin 0xffffffffffff9cd8"); - - - TEST("\xa5", "movsd"); - TEST("\x66\xa5", "movsw"); - TEST("\xf3\xa5", "rep movsd"); - TEST("\xf3\x66\xa5", "rep movsw"); - TEST("\xf3\xae", "rep scasb"); - TEST("\xf2\xae", "repnz scasb"); - TEST("\xf3\x66\xae", "rep scasb"); - TEST("\xf2\x66\xae", "repnz scasb"); - TEST("\xf3\xaf", "rep scasd"); - TEST("\xf2\xaf", "repnz scasd"); - TEST("\xf3\x66\xaf", "rep scasw"); - TEST("\xf2\x66\xaf", "repnz scasw"); - TEST64("\xf3\x48\xaf", "rep scasq"); - TEST64("\xf2\x48\xaf", "repnz scasq"); - TEST64("\xf3\x66\x48\xaf", "rep scasq"); - TEST64("\xf2\x66\x48\xaf", "repnz scasq"); - - TEST("\x66\x0f\xbe\xc2", "movsx ax, dl"); - TEST("\x0f\xbe\xc2", "movsx eax, dl"); - TEST("\x0f\xbe\xc4", "movsx eax, ah"); - TEST64("\x40\x0f\xbe\xc4", "movsx eax, spl"); - TEST("\x0f\xbf\xc2", "movsx eax, dx"); - TEST64("\x48\x0f\xbf\xc2", "movsx rax, dx"); - TEST64("\x48\x63\xc2", "movsx rax, edx"); - - TEST32("\x66\xc3", "retw"); - TEST32("\x66\xc2\x00\x00", "retw 0x0"); - TEST32("\x66\xc2\x0d\x00", "retw 0xd"); - TEST32("\x66\xc2\x0d\xff", "retw 0xff0d"); - TEST64("\x66\xc3", "ret"); - TEST64("\x66\xc2\x00\x00", "ret 0x0"); - TEST64("\x66\xc2\x0d\x00", "ret 0xd"); - TEST64("\x66\xc2\x0d\xff", "ret 0xff0d"); - TEST32("\xc3", "ret"); - TEST32("\xc2\x00\x00", "ret 0x0"); - TEST32("\xc2\x0d\x00", "ret 0xd"); - TEST32("\xc2\x0d\xff", "ret 0xff0d"); - TEST64("\xc3", "ret"); - TEST64("\xc2\x00\x00", "ret 0x0"); - TEST64("\xc2\x0d\x00", "ret 0xd"); - TEST64("\xc2\x0d\xff", "ret 0xff0d"); - TEST("\xca\x00\x00", "retfd 0x0"); - TEST("\xca\x0d\x00", "retfd 0xd"); - TEST("\xca\x0d\xff", "retfd 0xff0d"); - TEST("\xcb", "retfd"); - TEST("\x66\xca\x00\x00", "retfw 0x0"); - TEST("\x66\xca\x0d\x00", "retfw 0xd"); - TEST("\x66\xca\x0d\xff", "retfw 0xff0d"); - TEST("\x66\xcb", "retfw"); - TEST64("\x48\xca\x00\x00", "retfq 0x0"); - TEST64("\x48\xca\x0d\x00", "retfq 0xd"); - TEST64("\x48\xca\x0d\xff", "retfq 0xff0d"); - TEST64("\x48\xcb", "retfq"); - - // BMI1 - TEST("\xf3\x0f\xbc\xc0", "tzcnt eax, eax"); - TEST("\x66\xf3\x0f\xbc\xc0", "tzcnt ax, ax"); - TEST64("\xf3\x48\x0f\xbc\xc0", "tzcnt rax, rax"); - TEST("\xf3\x0f\xbd\xc0", "lzcnt eax, eax"); - TEST("\x66\xf3\x0f\xbd\xc0", "lzcnt ax, ax"); - TEST64("\xf3\x48\x0f\xbd\xc0", "lzcnt rax, rax"); - TEST3264("\xc4\xc2\x18\xf2\xc7", "andn eax, esp, edi", "andn eax, r12d, r15d"); - TEST3264("\xc4\xc2\x98\xf2\xc7", "andn eax, esp, edi", "andn rax, r12, r15"); - TEST64("\xc4\x42\x18\xf2\xc7", "andn r8d, r12d, r15d"); - TEST64("\xc4\x42\x98\xf2\xc7", "andn r8, r12, r15"); - TEST("\xc4\xe2\x78\xf3\xca", "blsr eax, edx"); - TEST("\xc4\xe2\x78\xf3\x08", "blsr eax, dword ptr [@ax]"); - TEST("\xc4\xe2\xf8\xf3\xca", "blsr @ax, @dx"); - TEST3264("\xc4\xe2\xf8\xf3\x08", "blsr eax, dword ptr [eax]", "blsr rax, qword ptr [rax]"); - TEST3264("\xc4\xc2\x38\xf3\xc9", "blsr eax, ecx", "blsr r8d, r9d"); - TEST3264("\xc4\xc2\xb8\xf3\xc9", "blsr eax, ecx", "blsr r8, r9"); - TEST3264("\xc4\xe2\x38\xf3\xc9", "blsr eax, ecx", "blsr r8d, ecx"); - TEST3264("\xc4\xe2\xb8\xf3\xc9", "blsr eax, ecx", "blsr r8, rcx"); - TEST3264("\xc4\xc2\x78\xf3\xc9", "blsr eax, ecx", "blsr eax, r9d"); - TEST3264("\xc4\xc2\xf8\xf3\xc9", "blsr eax, ecx", "blsr rax, r9"); - TEST("\xc4\xe2\x78\xf3\xd2", "blsmsk eax, edx"); - TEST("\xc4\xe2\x78\xf3\x10", "blsmsk eax, dword ptr [@ax]"); - TEST("\xc4\xe2\xf8\xf3\xd2", "blsmsk @ax, @dx"); - TEST3264("\xc4\xe2\xf8\xf3\x10", "blsmsk eax, dword ptr [eax]", "blsmsk rax, qword ptr [rax]"); - TEST("\xc4\xe2\x78\xf3\xda", "blsi eax, edx"); - TEST("\xc4\xe2\x78\xf3\x18", "blsi eax, dword ptr [@ax]"); - TEST("\xc4\xe2\xf8\xf3\xda", "blsi @ax, @dx"); - TEST3264("\xc4\xe2\xf8\xf3\x18", "blsi eax, dword ptr [eax]", "blsi rax, qword ptr [rax]"); - TEST3264("\xc4\xc2\x18\xf7\xc7", "bextr eax, edi, esp", "bextr eax, r15d, r12d"); - TEST3264("\xc4\xc2\x98\xf7\xc7", "bextr eax, edi, esp", "bextr rax, r15, r12"); - TEST64("\xc4\x42\x18\xf7\xc7", "bextr r8d, r15d, r12d"); - TEST64("\xc4\x42\x98\xf7\xc7", "bextr r8, r15, r12"); - - // NFx/66+F2/F3 combinations - TEST("\x0f\xc7\xf0", "rdrand eax"); - TEST64("\x48\x0f\xc7\xf0", "rdrand rax"); - TEST("\x66\x0f\xc7\xf0", "rdrand ax"); - TEST64("\x66\x48\x0f\xc7\xf0", "rdrand rax"); - TEST("\x0f\xc7\xf8", "rdseed eax"); - TEST64("\x48\x0f\xc7\xf8", "rdseed rax"); - TEST("\x66\x0f\xc7\xf8", "rdseed ax"); - TEST64("\x66\x48\x0f\xc7\xf8", "rdseed rax"); - TEST32("\xf3\x0f\xc7\xf8", "rdpid eax"); - TEST32("\x66\xf3\x0f\xc7\xf8", "rdpid eax"); - TEST32("\xf3\x66\x0f\xc7\xf8", "rdpid eax"); - TEST64("\xf3\x0f\xc7\xf8", "rdpid rax"); - TEST64("\x66\xf3\x0f\xc7\xf8", "rdpid rax"); - TEST64("\xf3\x66\x0f\xc7\xf8", "rdpid rax"); - TEST64("\xf3\x0f\xc7\x00", "UD"); - TEST64("\x0f\xc7\x30", "vmptrld qword ptr [rax]"); - TEST64("\x66\x0f\xc7\x30", "vmclear qword ptr [rax]"); - TEST64("\xf3\x0f\xc7\x30", "vmxon qword ptr [rax]"); - TEST("\x0f\x78\xc1", "vmread @cx, @ax"); - TEST("\x0f\x79\xc1", "vmwrite @ax, @cx"); - - TEST64("\x0f\x09", "wbinvd"); - TEST64("\xf3\x0f\x09", "wbnoinvd"); - TEST("\x66\x0f\x38\x82\x01", "invpcid @ax, xmmword ptr [@cx]"); - TEST("\x66\x0f\x38\x80\x02", "invept @ax, xmmword ptr [@dx]"); - TEST("\x66\x0f\x38\x81\x02", "invvpid @ax, xmmword ptr [@dx]"); - TEST("\x66\x0f\x38\xf8\x01", "movdir64b @ax, zmmword ptr [@cx]"); - // TODO: MOVDIR64B first operand has address size. - // TEST32("\x67\x66\x0f\x38\xf8\x01", "movdir64b ax, zmmword ptr [cx]"); - // TEST64("\x67\x66\x0f\x38\xf8\x01", "movdir64b eax, zmmword ptr [ecx]"); - TEST("\x0f\x30", "wrmsr"); - TEST("\x0f\x32", "rdmsr"); - TEST("\x0f\x01\xc6", "wrmsrns"); - TEST3264("\xf2\x0f\x01\xc6", "UD", "rdmsrlist"); - TEST3264("\xf3\x0f\x01\xc6", "UD", "wrmsrlist"); - TEST3264("\xc4\xe7\x7b\xf6\xc1\x10\x20\x30\x40", "UD", "rdmsr rcx, 0x40302010"); - TEST3264("\xc4\xe7\x7a\xf6\xc1\x10\x20\x30\x40", "UD", "wrmsrns 0x40302010, rcx"); - TEST3264("\xf2\x0f\x38\xf8\xc1", "UD", "urdmsr rcx, rax"); - TEST3264("\xf3\x0f\x38\xf8\xc1", "UD", "uwrmsr rcx, rax"); - TEST3264("\xc4\xe7\x7b\xf8\xc1\x10\x20\x30\x40", "UD", "urdmsr rcx, 0x40302010"); - TEST3264("\xc4\xe7\x7a\xf8\xc1\x10\x20\x30\x40", "UD", "uwrmsr 0x40302010, rcx"); - - TEST("\x0f\x38\xfc\xc1", "UD"); // Must be memory operand - TEST("\x0f\x38\xfc\x01", "aadd dword ptr [@cx], eax"); - TEST64("\x48\x0f\x38\xfc\x01", "aadd qword ptr [rcx], rax"); - TEST("\x66\x0f\x38\xfc\xc1", "UD"); // Must be memory operand - TEST("\x66\x0f\x38\xfc\x01", "aand dword ptr [@cx], eax"); - TEST64("\x66\x48\x0f\x38\xfc\x01", "aand qword ptr [rcx], rax"); - TEST("\xf3\x0f\x38\xfc\xc1", "UD"); // Must be memory operand - TEST("\xf3\x0f\x38\xfc\x01", "axor dword ptr [@cx], eax"); - TEST64("\xf3\x48\x0f\x38\xfc\x01", "axor qword ptr [rcx], rax"); - TEST("\xf2\x0f\x38\xfc\xc1", "UD"); // Must be memory operand - TEST("\xf2\x0f\x38\xfc\x01", "aor dword ptr [@cx], eax"); - TEST64("\xf2\x48\x0f\x38\xfc\x01", "aor qword ptr [rcx], rax"); - - TEST64("\xc4\xe2\x61\xe0\x08", "cmpoxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe0\x08", "cmpoxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe1\x08", "cmpnoxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe1\x08", "cmpnoxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe2\x08", "cmpbxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe2\x08", "cmpbxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe3\x08", "cmpnbxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe3\x08", "cmpnbxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe4\x08", "cmpzxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe4\x08", "cmpzxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe5\x08", "cmpnzxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe5\x08", "cmpnzxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe6\x08", "cmpbexadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe6\x08", "cmpbexadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe7\x08", "cmpnbexadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe7\x08", "cmpnbexadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe8\x08", "cmpsxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe8\x08", "cmpsxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xe9\x08", "cmpnsxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xe9\x08", "cmpnsxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xea\x08", "cmppxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xea\x08", "cmppxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xeb\x08", "cmpnpxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xeb\x08", "cmpnpxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xec\x08", "cmplxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xec\x08", "cmplxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xed\x08", "cmpnlxadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xed\x08", "cmpnlxadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xee\x08", "cmplexadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xee\x08", "cmplexadd qword ptr [rax], rcx, rbx"); - TEST64("\xc4\xe2\x61\xef\x08", "cmpnlexadd dword ptr [rax], ecx, ebx"); - TEST64("\xc4\xe2\xe1\xef\x08", "cmpnlexadd qword ptr [rax], rcx, rbx"); - - TEST("\x0f\xae\xe8", "lfence"); - TEST("\x0f\xae\xe9", "lfence"); - TEST("\x0f\xae\xef", "lfence"); - TEST("\x0f\xae\xf0", "mfence"); - TEST("\x0f\xae\xf7", "mfence"); - TEST("\x0f\xae\xf8", "sfence"); - TEST("\x0f\xae\xf9", "sfence"); - TEST("\x0f\xae\xff", "sfence"); - - TEST("\x0f\x6e\xc0", "movd mm0, eax"); - TEST64("\x48\x0f\x6e\xc0", "movq mm0, rax"); - TEST("\x0f\x70\xc0\x85", "pshufw mm0, mm0, 0x85"); - - TEST("\x0f\x58\xc1", "addps xmm0, xmm1"); - TEST64("\x40\x0f\x58\xc1", "addps xmm0, xmm1"); - TEST64("\x41\x0f\x58\xc1", "addps xmm0, xmm9"); - TEST64("\x42\x0f\x58\xc1", "addps xmm0, xmm1"); // REX.X ignored - TEST64("\x43\x0f\x58\xc1", "addps xmm0, xmm9"); // REX.X ignored - TEST64("\x44\x0f\x58\xc1", "addps xmm8, xmm1"); - TEST64("\x45\x0f\x58\xc1", "addps xmm8, xmm9"); - TEST64("\x46\x0f\x58\xc1", "addps xmm8, xmm1"); // REX.X ignored - TEST64("\x47\x0f\x58\xc1", "addps xmm8, xmm9"); // REX.X ignored - TEST("\xf3\x0f\x2a\xc1", "cvtsi2ss xmm0, ecx"); - TEST("\xf3\x66\x0f\x2a\xc1", "cvtsi2ss xmm0, ecx"); - TEST("\x66\xf3\x0f\x2a\xc1", "cvtsi2ss xmm0, ecx"); - TEST64("\xf3\x48\x0f\x2a\xc1", "cvtsi2ss xmm0, rcx"); - TEST64("\x66\xf3\x48\x0f\x2a\xc1", "cvtsi2ss xmm0, rcx"); - TEST64("\x66\x0f\x50\xc1", "movmskpd rax, xmm1"); - TEST("\x66\x0f\xc6\xc0\x01", "shufpd xmm0, xmm0, 0x1"); - TEST("\x66\x0f\x71\xd0\x01", "psrlw xmm0, 0x1"); - TEST("\x66\x0f\x3a\x20\xc4\x01", "pinsrb xmm0, spl, 0x1"); - TEST("\x66\x0f\x71\x10\x01", "UD"); - TEST("\x66\x0f\x78\xc0\xab\xcd", "extrq xmm0, 0xab, 0xcd"); - TEST("\xf2\x0f\x78\xc1\xab\xcd", "insertq xmm0, xmm1, 0xab, 0xcd"); - TEST("\x66\x0f\x38\x20\xc1", "pmovsxbw xmm0, xmm1"); - TEST("\x66\x0f\x38\x20\x00", "pmovsxbw xmm0, qword ptr [@ax]"); - TEST("\x66\x0f\x38\x21\xc1", "pmovsxbd xmm0, xmm1"); - TEST("\x66\x0f\x38\x21\x00", "pmovsxbd xmm0, dword ptr [@ax]"); - TEST("\x66\x0f\x38\x22\xc1", "pmovsxbq xmm0, xmm1"); - TEST("\x66\x0f\x38\x22\x00", "pmovsxbq xmm0, word ptr [@ax]"); - TEST("\x66\x0f\x38\x23\xc1", "pmovsxwd xmm0, xmm1"); - TEST("\x66\x0f\x38\x23\x00", "pmovsxwd xmm0, qword ptr [@ax]"); - TEST("\x66\x0f\x38\x24\xc1", "pmovsxwq xmm0, xmm1"); - TEST("\x66\x0f\x38\x24\x00", "pmovsxwq xmm0, dword ptr [@ax]"); - TEST("\x66\x0f\x38\x25\xc1", "pmovsxdq xmm0, xmm1"); - TEST("\x66\x0f\x38\x25\x00", "pmovsxdq xmm0, qword ptr [@ax]"); - TEST("\x66\x0f\x38\x30\xc1", "pmovzxbw xmm0, xmm1"); - TEST("\x66\x0f\x38\x30\x00", "pmovzxbw xmm0, qword ptr [@ax]"); - TEST("\x66\x0f\x38\x31\xc1", "pmovzxbd xmm0, xmm1"); - TEST("\x66\x0f\x38\x31\x00", "pmovzxbd xmm0, dword ptr [@ax]"); - TEST("\x66\x0f\x38\x32\xc1", "pmovzxbq xmm0, xmm1"); - TEST("\x66\x0f\x38\x32\x00", "pmovzxbq xmm0, word ptr [@ax]"); - TEST("\x66\x0f\x38\x33\xc1", "pmovzxwd xmm0, xmm1"); - TEST("\x66\x0f\x38\x33\x00", "pmovzxwd xmm0, qword ptr [@ax]"); - TEST("\x66\x0f\x38\x34\xc1", "pmovzxwq xmm0, xmm1"); - TEST("\x66\x0f\x38\x34\x00", "pmovzxwq xmm0, dword ptr [@ax]"); - TEST("\x66\x0f\x38\x35\xc1", "pmovzxdq xmm0, xmm1"); - TEST("\x66\x0f\x38\x35\x00", "pmovzxdq xmm0, qword ptr [@ax]"); - - TEST("\xc4", "PARTIAL"); - TEST("\xc5", "PARTIAL"); - TEST32("\xc4\xc0", "PARTIAL"); - TEST64("\xc4\x00", "PARTIAL"); - TEST32("\xc5\xc0", "PARTIAL"); - TEST64("\xc5\x00", "PARTIAL"); - TEST("\xc4\xe0\x78\x10\xc0", "UD"); // VEX map 0 - TEST("\xc4\xe1\x78\x10\xc0", "vmovups xmm0, xmm0"); // VEX map 1 - TEST("\xc4\xe2\x78\x10\xc0", "UD"); // VEX map 2 - TEST("\xc4\xe3\x78\x10\xc0\x00", "UD"); // VEX map 3 - TEST("\xc4\xe4\x78\x10\xc0", "UD"); // VEX map 4 - TEST("\xc4\xe5\x78\x10\xc0", "UD"); // VEX map 5 - TEST("\xc4\xe6\x78\x10\xc0", "UD"); // VEX map 6 - TEST("\xc4\xe7\x78\x10\xc0", "UD"); // VEX map 7 - TEST("\xc4\xe8\x78\x10\xc0", "UD"); // VEX map 8 - TEST("\xc4\xe9\x78\x10\xc0", "UD"); // VEX map 9 - TEST("\xc4\xea\x78\x10\xc0", "UD"); // VEX map 10 - TEST("\xc4\xeb\x78\x10\xc0", "UD"); // VEX map 11 - TEST("\xc4\xec\x78\x10\xc0", "UD"); // VEX map 12 - TEST("\xc4\xed\x78\x10\xc0", "UD"); // VEX map 13 - TEST("\xc4\xee\x78\x10\xc0", "UD"); // VEX map 14 - TEST("\xc4\xef\x78\x10\xc0", "UD"); // VEX map 15 - TEST("\xc4\xf0\x78\x10\xc0", "UD"); // VEX map 16 - TEST("\xc4\xf1\x78\x10\xc0", "UD"); // VEX map 17 - TEST("\xc4\xf2\x78\x10\xc0", "UD"); // VEX map 18 - TEST("\xc4\xf3\x78\x10\xc0", "UD"); // VEX map 19 - TEST("\xc4\xf4\x78\x10\xc0", "UD"); // VEX map 20 - TEST("\xc4\xf5\x78\x10\xc0", "UD"); // VEX map 21 - TEST("\xc4\xf6\x78\x10\xc0", "UD"); // VEX map 22 - TEST("\xc4\xf7\x78\x10\xc0", "UD"); // VEX map 23 - TEST("\xc4\xf8\x78\x10\xc0", "UD"); // VEX map 24 - TEST("\xc4\xf9\x78\x10\xc0", "UD"); // VEX map 25 - TEST("\xc4\xfa\x78\x10\xc0", "UD"); // VEX map 26 - TEST("\xc4\xfb\x78\x10\xc0", "UD"); // VEX map 27 - TEST("\xc4\xfc\x78\x10\xc0", "UD"); // VEX map 28 - TEST("\xc4\xfd\x78\x10\xc0", "UD"); // VEX map 29 - TEST("\xc4\xfe\x78\x10\xc0", "UD"); // VEX map 30 - TEST("\xc4\xff\x78\x10\xc0", "UD"); // VEX map 31 - TEST32("\xc4\x00", "les eax, fword ptr [eax]"); - TEST32("\xc5\x00", "lds eax, fword ptr [eax]"); - TEST("\x0f\xb2\x00", "lss eax, fword ptr [@ax]"); - TEST64("\x48\x0f\xb2\x00", "lss rax, tbyte ptr [rax]"); - TEST("\x0f\xb4\x00", "lfs eax, fword ptr [@ax]"); - TEST64("\x48\x0f\xb4\x00", "lfs rax, tbyte ptr [rax]"); - TEST("\x0f\xb5\x00", "lgs eax, fword ptr [@ax]"); - TEST64("\x48\x0f\xb5\x00", "lgs rax, tbyte ptr [rax]"); - TEST("\xc5\xf2\x2a\xc0", "vcvtsi2ss xmm0, xmm1, eax"); - TEST("\xc4\xe1\xf2\x2a\xc0", "vcvtsi2ss xmm0, xmm1, @ax"); // VEX.W ignored - TEST("\xf3\xc5\xf2\x2a\xc0", "UD"); // VEX+REP - TEST("\xf2\xc5\xf2\x2a\xc0", "UD"); // VEX+REPNZ - TEST("\xf2\xf3\xc5\xf2\x2a\xc0", "UD"); // VEX+REP+REPNZ - TEST("\x66\xc5\xf2\x2a\xc0", "UD"); // VEX+66 - TEST("\xf0\xc5\xf2\x2a\xc0", "UD"); // VEX+LOCK - TEST64("\x40\xc5\xf2\x2a\xc0", "UD"); // VEX+REX - TEST64("\x40\x26\xc5\xf2\x2a\xc0", "vcvtsi2ss xmm0, xmm1, eax"); // VEX+REX, but REX doesn't precede VEX - - TEST("\xd9\x00", "fld dword ptr [@ax]"); - TEST("\xdd\x00", "fld qword ptr [@ax]"); - TEST("\xdb\x28", "fld tbyte ptr [@ax]"); - TEST("\xd9\xc1", "fld st(1)"); - TEST("\xdf\xe9", "fucomip st(0), st(1)"); - TEST64("\x45\xdf\xe9", "fucomip st(0), st(1)"); // REX.RB are ignored. - - TEST("\xf3\x0f\x7e\x5c\x24\x08", "movq xmm3, qword ptr [@sp+0x8]"); - TEST3264("\xc4\xe1\x00\x58\xc1", "vaddps xmm0, xmm7, xmm1", "vaddps xmm0, xmm15, xmm1"); // MSB in vvvv ignored - TEST3264("\xc4\xc1\x78\x58\xc0", "vaddps xmm0, xmm0, xmm0", "vaddps xmm0, xmm0, xmm8"); // VEX.B ignored in 32-bit - TEST("\xc5\xf9\x6e\xc8", "vmovd xmm1, eax"); - TEST64("\xc4\xe1\xf9\x6e\xc8", "vmovq xmm1, rax"); - TEST32("\xc4\xe1\xf9\x6e\xc8", "vmovd xmm1, eax"); - TEST("\xc5\xf9\x7e\xc8", "vmovd eax, xmm1"); - TEST64("\xc4\xe1\xf9\x7e\xc8", "vmovq rax, xmm1"); - TEST32("\xc4\xe1\xf9\x7e\xc8", "vmovd eax, xmm1"); - TEST("\xc5\xf2\x10\xc2", "vmovss xmm0, xmm1, xmm2"); - TEST("\xc5\xf6\x10\xc2", "vmovss xmm0, xmm1, xmm2"); // VEX.L=1 - TEST("\xc5\xfa\x10\x04\x25\x34\x12\x00\x00", "vmovss xmm0, dword ptr [0x1234]"); - TEST("\xc5\xf2\x10\x04\x25\x34\x12\x00\x00", "UD"); // VEX.vvvv != 0 - TEST("\xc5\xfa\x11\x04\x25\x34\x12\x00\x00", "vmovss dword ptr [0x1234], xmm0"); - TEST("\xc5\xf2\x11\x04\x25\x34\x12\x00\x00", "UD"); // VEX.vvvv != 0 - TEST("\xc5\xf2\x2a\xc0", "vcvtsi2ss xmm0, xmm1, eax"); - TEST("\xc4\xe1\xf2\x2a\xc0", "vcvtsi2ss xmm0, xmm1, @ax"); - TEST("\xc5\xf8\x53\xc0", "vrcpps xmm0, xmm0"); - TEST("\xc5\xf9\xf7\xc1", "vmaskmovdqu xmm0, xmm1"); - TEST("\xc5\xf9\xf7\x00", "UD"); // must have memory operand - TEST("\xc5\xfd\xf7\xc1", "UD"); // VEX.L != 0 - TEST64("\xc5\x07\xd0\x02", "vaddsubps ymm8, ymm15, ymmword ptr [rdx]"); - TEST("\xc4\xc3\x6d\x09\xd9\x85", "UD"); // VEX.vvvv != 0 - TEST3264("\xc4\xc3\x7d\x09\xd9\x85", "vroundpd ymm3, ymm1, 0x85", "vroundpd ymm3, ymm9, 0x85"); - TEST("\xc5\xff\xf0\xd1", "UD"); // must have memory operand - TEST("\xc5\xff\xf0\x11", "vlddqu ymm2, ymmword ptr [@cx]"); - - // VMOVDDUP with L0 has smaller second operand size. - TEST("\xf2\x0f\x12\x08", "movddup xmm1, qword ptr [@ax]"); - TEST("\xf2\x0f\x12\xc8", "movddup xmm1, xmm0"); - TEST("\xc5\xfb\x12\x08", "vmovddup xmm1, qword ptr [@ax]"); - TEST("\xc5\xfb\x12\xc8", "vmovddup xmm1, xmm0"); - TEST("\xc5\xff\x12\x08", "vmovddup ymm1, ymmword ptr [@ax]"); - TEST("\xc5\xff\x12\xc8", "vmovddup ymm1, ymm0"); - - TEST("\xc5\xf1\xe1\xc2", "vpsraw xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xe1\x00", "vpsraw xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xe1\xc2", "vpsraw ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xe1\x00", "vpsraw ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xe2\xc2", "vpsrad xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xe2\x00", "vpsrad xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xe2\xc2", "vpsrad ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xe2\x00", "vpsrad ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xd1\xc2", "vpsrlw xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xd1\x00", "vpsrlw xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xd1\xc2", "vpsrlw ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xd1\x00", "vpsrlw ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xd2\xc2", "vpsrld xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xd2\x00", "vpsrld xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xd2\xc2", "vpsrld ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xd2\x00", "vpsrld ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xd3\xc2", "vpsrlq xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xd3\x00", "vpsrlq xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xd3\xc2", "vpsrlq ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xd3\x00", "vpsrlq ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xf1\xc2", "vpsllw xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xf1\x00", "vpsllw xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xf1\xc2", "vpsllw ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xf1\x00", "vpsllw ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xf2\xc2", "vpslld xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xf2\x00", "vpslld xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xf2\xc2", "vpslld ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xf2\x00", "vpslld ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc5\xf1\xf3\xc2", "vpsllq xmm0, xmm1, xmm2"); - TEST("\xc5\xf1\xf3\x00", "vpsllq xmm0, xmm1, xmmword ptr [@ax]"); - TEST("\xc5\xf5\xf3\xc2", "vpsllq ymm0, ymm1, xmm2"); - TEST("\xc5\xf5\xf3\x00", "vpsllq ymm0, ymm1, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x71\x47\xc2", "vpsllvd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x47\xc2", "vpsllvq xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x45\xc2", "vpsrlvd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x45\xc2", "vpsrlvq xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x46\xc2", "vpsravd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x46\xc2", "UD"); // VEX-encoded VPSRAVQ doesn't exist - - TEST("\xc4\xe3\x79\x14\xc0\x00", "vpextrb eax, xmm0, 0x0"); - TEST("\xc4\xe3\xf9\x14\xc0\x00", "vpextrb eax, xmm0, 0x0"); - TEST("\xc4\xe3\x79\x15\xc0\x00", "vpextrw eax, xmm0, 0x0"); - TEST("\xc4\xe3\xf9\x15\xc0\x00", "vpextrw eax, xmm0, 0x0"); - TEST("\xc4\xe1\x79\xc5\xc0\x00", "vpextrw eax, xmm0, 0x0"); - TEST("\xc4\xe3\x79\x16\xc0\x00", "vpextrd eax, xmm0, 0x0"); - TEST3264("\xc4\xe3\xf9\x16\xc0\x00", "vpextrd eax, xmm0, 0x0", "vpextrq rax, xmm0, 0x0"); - - TEST("\xc4\xe3\x71\x20\xc0\x00", "vpinsrb xmm0, xmm1, al, 0x0"); - TEST("\xc4\xe3\xf1\x20\xc0\x00", "vpinsrb xmm0, xmm1, al, 0x0"); - TEST("\xc4\xe3\x71\x20\xc6\x00", "vpinsrb xmm0, xmm1, sil, 0x0"); - TEST("\xc4\xe1\x71\xc4\xc0\x00", "vpinsrw xmm0, xmm1, ax, 0x0"); - TEST("\xc4\xe1\xf1\xc4\xc0\x00", "vpinsrw xmm0, xmm1, ax, 0x0"); - TEST("\xc4\xe3\x71\x22\xc0\x00", "vpinsrd xmm0, xmm1, eax, 0x0"); - TEST3264("\xc4\xe3\xf1\x22\xc0\x00", "vpinsrd xmm0, xmm1, eax, 0x0", "vpinsrq xmm0, xmm1, rax, 0x0"); - TEST("\xc4\xe3\x75\x20\xc0\x00", "UD"); // VEX.L != 0 - TEST("\xc4\xe1\x75\xc4\xc0\x00", "UD"); // VEX.L != 0 - TEST("\xc4\xe1\xf5\xc4\xc0\x00", "UD"); // VEX.L != 0 - TEST("\xc4\xe3\x75\x22\xc0\x00", "UD"); // VEX.L != 0 - TEST("\xc4\xe3\xf5\x22\xc0\x00", "UD"); // VEX.L != 0 - - TEST("\xc5\xf1\x71\xd7\x02", "vpsrlw xmm1, xmm7, 0x2"); - TEST("\xc5\xf5\x71\xd7\x02", "vpsrlw ymm1, ymm7, 0x2"); - TEST("\xc5\xf5\x71\x00\x02", "UD"); // Must have register operand - TEST("\xc4\xe2\x71\x45\xc2", "vpsrlvd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\x45\xc2", "vpsrlvd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf1\x45\xc2", "vpsrlvq xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf5\x45\xc2", "vpsrlvq ymm0, ymm1, ymm2"); - - TEST("\xc4\xe2\x79\x20\xc1", "vpmovsxbw xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x20\xc1", "vpmovsxbw ymm0, xmm1"); - TEST("\xc4\xe2\x79\x20\x00", "vpmovsxbw xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x20\x00", "vpmovsxbw ymm0, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x79\x21\xc1", "vpmovsxbd xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x21\xc1", "vpmovsxbd ymm0, xmm1"); - TEST("\xc4\xe2\x79\x21\x00", "vpmovsxbd xmm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x21\x00", "vpmovsxbd ymm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x79\x22\xc1", "vpmovsxbq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x22\xc1", "vpmovsxbq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x22\x00", "vpmovsxbq xmm0, word ptr [@ax]"); - TEST("\xc4\xe2\x7d\x22\x00", "vpmovsxbq ymm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x79\x23\xc1", "vpmovsxwd xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x23\xc1", "vpmovsxwd ymm0, xmm1"); - TEST("\xc4\xe2\x79\x23\x00", "vpmovsxwd xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x23\x00", "vpmovsxwd ymm0, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x79\x24\xc1", "vpmovsxwq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x24\xc1", "vpmovsxwq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x24\x00", "vpmovsxwq xmm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x24\x00", "vpmovsxwq ymm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x79\x25\xc1", "vpmovsxdq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x25\xc1", "vpmovsxdq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x25\x00", "vpmovsxdq xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x25\x00", "vpmovsxdq ymm0, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x79\x30\xc1", "vpmovzxbw xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x30\xc1", "vpmovzxbw ymm0, xmm1"); - TEST("\xc4\xe2\x79\x30\x00", "vpmovzxbw xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x30\x00", "vpmovzxbw ymm0, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x79\x31\xc1", "vpmovzxbd xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x31\xc1", "vpmovzxbd ymm0, xmm1"); - TEST("\xc4\xe2\x79\x31\x00", "vpmovzxbd xmm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x31\x00", "vpmovzxbd ymm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x79\x32\xc1", "vpmovzxbq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x32\xc1", "vpmovzxbq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x32\x00", "vpmovzxbq xmm0, word ptr [@ax]"); - TEST("\xc4\xe2\x7d\x32\x00", "vpmovzxbq ymm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x79\x33\xc1", "vpmovzxwd xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x33\xc1", "vpmovzxwd ymm0, xmm1"); - TEST("\xc4\xe2\x79\x33\x00", "vpmovzxwd xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x33\x00", "vpmovzxwd ymm0, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x79\x34\xc1", "vpmovzxwq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x34\xc1", "vpmovzxwq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x34\x00", "vpmovzxwq xmm0, dword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x34\x00", "vpmovzxwq ymm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x79\x35\xc1", "vpmovzxdq xmm0, xmm1"); - TEST("\xc4\xe2\x7d\x35\xc1", "vpmovzxdq ymm0, xmm1"); - TEST("\xc4\xe2\x79\x35\x00", "vpmovzxdq xmm0, qword ptr [@ax]"); - TEST("\xc4\xe2\x7d\x35\x00", "vpmovzxdq ymm0, xmmword ptr [@ax]"); - - TEST("\xc4\xe3\x71\x4a\xc2", "PARTIAL"); - TEST("\xc4\xe3\x71\x4a\xc2\x30", "vblendvps xmm0, xmm1, xmm2, xmm3"); - TEST3264("\xc4\xe3\x75\x4a\xc2\xf0", "vblendvps ymm0, ymm1, ymm2, ymm7", "vblendvps ymm0, ymm1, ymm2, ymm15"); // Bit 7 is ignored - TEST("\xc4\xe3\x71\x4b\xc2\x70", "vblendvpd xmm0, xmm1, xmm2, xmm7"); - TEST3264("\xc4\xe3\x75\x4b\xc2\x80", "vblendvpd ymm0, ymm1, ymm2, ymm0", "vblendvpd ymm0, ymm1, ymm2, ymm8"); // Bit 7 is ignored - TEST3264("\xc4\xc3\xfd\x00\xc9\x12", "vpermq ymm1, ymm1, 0x12", "vpermq ymm1, ymm9, 0x12"); // VEX.B ignored - TEST("\xc4\xc3\x7d\x00\xc9\x12", "UD"); // VEX.W = 0 is UD - TEST("\xc4\xe3\xfd\x01\xcf\x12", "vpermpd ymm1, ymm7, 0x12"); - - TEST("\xc4\xe2\x71\x96\xc2", "vfmaddsub132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x96\x06", "vfmaddsub132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x96\xc2", "vfmaddsub132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x96\x06", "vfmaddsub132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x96\xc2", "vfmaddsub132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x96\x06", "vfmaddsub132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x96\xc2", "vfmaddsub132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x96\x06", "vfmaddsub132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x97\xc2", "vfmsubadd132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x97\x06", "vfmsubadd132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x97\xc2", "vfmsubadd132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x97\x06", "vfmsubadd132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x97\xc2", "vfmsubadd132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x97\x06", "vfmsubadd132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x97\xc2", "vfmsubadd132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x97\x06", "vfmsubadd132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x98\xc2", "vfmadd132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x98\x06", "vfmadd132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x98\xc2", "vfmadd132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x98\x06", "vfmadd132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x98\xc2", "vfmadd132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x98\x06", "vfmadd132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x98\xc2", "vfmadd132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x98\x06", "vfmadd132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x99\xc2", "vfmadd132ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x99\x06", "vfmadd132ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\x99\xc2", "vfmadd132sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x99\x06", "vfmadd132sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\x9a\xc2", "vfmsub132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9a\x06", "vfmsub132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x9a\xc2", "vfmsub132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x9a\x06", "vfmsub132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9a\xc2", "vfmsub132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9a\x06", "vfmsub132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x9a\xc2", "vfmsub132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x9a\x06", "vfmsub132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x9b\xc2", "vfmsub132ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9b\x06", "vfmsub132ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9b\xc2", "vfmsub132sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9b\x06", "vfmsub132sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\x9c\xc2", "vfnmadd132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9c\x06", "vfnmadd132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x9c\xc2", "vfnmadd132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x9c\x06", "vfnmadd132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9c\xc2", "vfnmadd132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9c\x06", "vfnmadd132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x9c\xc2", "vfnmadd132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x9c\x06", "vfnmadd132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x9d\xc2", "vfnmadd132ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9d\x06", "vfnmadd132ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9d\xc2", "vfnmadd132sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9d\x06", "vfnmadd132sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\x9e\xc2", "vfnmsub132ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9e\x06", "vfnmsub132ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\x9e\xc2", "vfnmsub132ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\x9e\x06", "vfnmsub132ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9e\xc2", "vfnmsub132pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9e\x06", "vfnmsub132pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\x9e\xc2", "vfnmsub132pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\x9e\x06", "vfnmsub132pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\x9f\xc2", "vfnmsub132ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\x9f\x06", "vfnmsub132ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\x9f\xc2", "vfnmsub132sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\x9f\x06", "vfnmsub132sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xa6\xc2", "vfmaddsub213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xa6\x06", "vfmaddsub213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xa6\xc2", "vfmaddsub213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xa6\x06", "vfmaddsub213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xa6\xc2", "vfmaddsub213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xa6\x06", "vfmaddsub213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xa6\xc2", "vfmaddsub213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xa6\x06", "vfmaddsub213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xa7\xc2", "vfmsubadd213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xa7\x06", "vfmsubadd213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xa7\xc2", "vfmsubadd213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xa7\x06", "vfmsubadd213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xa7\xc2", "vfmsubadd213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xa7\x06", "vfmsubadd213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xa7\xc2", "vfmsubadd213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xa7\x06", "vfmsubadd213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xa8\xc2", "vfmadd213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xa8\x06", "vfmadd213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xa8\xc2", "vfmadd213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xa8\x06", "vfmadd213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xa8\xc2", "vfmadd213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xa8\x06", "vfmadd213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xa8\xc2", "vfmadd213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xa8\x06", "vfmadd213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xa9\xc2", "vfmadd213ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xa9\x06", "vfmadd213ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xa9\xc2", "vfmadd213sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xa9\x06", "vfmadd213sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xaa\xc2", "vfmsub213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xaa\x06", "vfmsub213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xaa\xc2", "vfmsub213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xaa\x06", "vfmsub213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xaa\xc2", "vfmsub213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xaa\x06", "vfmsub213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xaa\xc2", "vfmsub213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xaa\x06", "vfmsub213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xab\xc2", "vfmsub213ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xab\x06", "vfmsub213ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xab\xc2", "vfmsub213sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xab\x06", "vfmsub213sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xac\xc2", "vfnmadd213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xac\x06", "vfnmadd213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xac\xc2", "vfnmadd213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xac\x06", "vfnmadd213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xac\xc2", "vfnmadd213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xac\x06", "vfnmadd213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xac\xc2", "vfnmadd213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xac\x06", "vfnmadd213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xad\xc2", "vfnmadd213ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xad\x06", "vfnmadd213ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xad\xc2", "vfnmadd213sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xad\x06", "vfnmadd213sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xae\xc2", "vfnmsub213ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xae\x06", "vfnmsub213ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xae\xc2", "vfnmsub213ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xae\x06", "vfnmsub213ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xae\xc2", "vfnmsub213pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xae\x06", "vfnmsub213pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xae\xc2", "vfnmsub213pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xae\x06", "vfnmsub213pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xaf\xc2", "vfnmsub213ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xaf\x06", "vfnmsub213ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xaf\xc2", "vfnmsub213sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xaf\x06", "vfnmsub213sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xb6\xc2", "vfmaddsub231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xb6\x06", "vfmaddsub231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xb6\xc2", "vfmaddsub231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xb6\x06", "vfmaddsub231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xb6\xc2", "vfmaddsub231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xb6\x06", "vfmaddsub231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xb6\xc2", "vfmaddsub231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xb6\x06", "vfmaddsub231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xb7\xc2", "vfmsubadd231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xb7\x06", "vfmsubadd231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xb7\xc2", "vfmsubadd231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xb7\x06", "vfmsubadd231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xb7\xc2", "vfmsubadd231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xb7\x06", "vfmsubadd231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xb7\xc2", "vfmsubadd231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xb7\x06", "vfmsubadd231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xb8\xc2", "vfmadd231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xb8\x06", "vfmadd231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xb8\xc2", "vfmadd231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xb8\x06", "vfmadd231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xb8\xc2", "vfmadd231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xb8\x06", "vfmadd231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xb8\xc2", "vfmadd231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xb8\x06", "vfmadd231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xb9\xc2", "vfmadd231ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xb9\x06", "vfmadd231ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xb9\xc2", "vfmadd231sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xb9\x06", "vfmadd231sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xba\xc2", "vfmsub231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xba\x06", "vfmsub231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xba\xc2", "vfmsub231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xba\x06", "vfmsub231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xba\xc2", "vfmsub231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xba\x06", "vfmsub231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xba\xc2", "vfmsub231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xba\x06", "vfmsub231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xbb\xc2", "vfmsub231ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xbb\x06", "vfmsub231ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xbb\xc2", "vfmsub231sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xbb\x06", "vfmsub231sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xbc\xc2", "vfnmadd231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xbc\x06", "vfnmadd231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xbc\xc2", "vfnmadd231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xbc\x06", "vfnmadd231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xbc\xc2", "vfnmadd231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xbc\x06", "vfnmadd231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xbc\xc2", "vfnmadd231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xbc\x06", "vfnmadd231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xbd\xc2", "vfnmadd231ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xbd\x06", "vfnmadd231ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xbd\xc2", "vfnmadd231sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xbd\x06", "vfnmadd231sd xmm0, xmm1, qword ptr [@si]"); - TEST("\xc4\xe2\x71\xbe\xc2", "vfnmsub231ps xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xbe\x06", "vfnmsub231ps xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\x75\xbe\xc2", "vfnmsub231ps ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x75\xbe\x06", "vfnmsub231ps ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\xf1\xbe\xc2", "vfnmsub231pd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xbe\x06", "vfnmsub231pd xmm0, xmm1, xmmword ptr [@si]"); - TEST("\xc4\xe2\xf5\xbe\xc2", "vfnmsub231pd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf5\xbe\x06", "vfnmsub231pd ymm0, ymm1, ymmword ptr [@si]"); - TEST("\xc4\xe2\x71\xbf\xc2", "vfnmsub231ss xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x71\xbf\x06", "vfnmsub231ss xmm0, xmm1, dword ptr [@si]"); - TEST("\xc4\xe2\xf1\xbf\xc2", "vfnmsub231sd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf1\xbf\x06", "vfnmsub231sd xmm0, xmm1, qword ptr [@si]"); - - TEST("\xc4\xe2\x79\xdb\xc1", "vaesimc xmm0, xmm1"); - TEST("\xc4\xe2\x7d\xdb\xc1", "UD"); // VEX.L != 0 - TEST("\xc4\xe3\x79\xdf\xc1\xae", "vaeskeygenassist xmm0, xmm1, 0xae"); - TEST("\xc4\xe3\x7d\xdf\xc1\xae", "UD"); // VEX.L != 0 - TEST("\xc4\xe2\x71\xdc\xc2", "vaesenc xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\xdc\xc2", "vaesenc ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\xdd\xc2", "vaesenclast xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\xdd\xc2", "vaesenclast ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\xde\xc2", "vaesdec xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\xde\xc2", "vaesdec ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\xdf\xc2", "vaesdeclast xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\xdf\xc2", "vaesdeclast ymm0, ymm1, ymm2"); - - TEST("\xc4\xe2\x70\x50\xc2", "vpdpbuud xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x74\x50\xc2", "vpdpbuud ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\x50\xc2", "vpdpbusd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\x50\xc2", "vpdpbusd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x72\x50\xc2", "vpdpbsud xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x76\x50\xc2", "vpdpbsud ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x73\x50\xc2", "vpdpbssd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x77\x50\xc2", "vpdpbssd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x70\x51\xc2", "vpdpbuuds xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x74\x51\xc2", "vpdpbuuds ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\x51\xc2", "vpdpbusds xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\x51\xc2", "vpdpbusds ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x72\x51\xc2", "vpdpbsuds xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x76\x51\xc2", "vpdpbsuds ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x73\x51\xc2", "vpdpbssds xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x77\x51\xc2", "vpdpbssds ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\x52\xc2", "vpdpwssd xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\x52\xc2", "vpdpwssd ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\x71\x53\xc2", "vpdpwssds xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\x75\x53\xc2", "vpdpwssds ymm0, ymm1, ymm2"); - - TEST("\xc4\xe2\x78\xb0\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x78\xb0\x08", "vcvtneoph2ps xmm1, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x7c\xb0\x08", "vcvtneoph2ps ymm1, ymmword ptr [@ax]"); - TEST("\xc4\xe2\x79\xb0\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x79\xb0\x08", "vcvtneeph2ps xmm1, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x7d\xb0\x08", "vcvtneeph2ps ymm1, ymmword ptr [@ax]"); - TEST("\xc4\xe2\x7a\xb0\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x7a\xb0\x08", "vcvtneebf162ps xmm1, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x7e\xb0\x08", "vcvtneebf162ps ymm1, ymmword ptr [@ax]"); - TEST("\xc4\xe2\x7b\xb0\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x7b\xb0\x08", "vcvtneobf162ps xmm1, xmmword ptr [@ax]"); - TEST("\xc4\xe2\x7f\xb0\x08", "vcvtneobf162ps ymm1, ymmword ptr [@ax]"); - TEST("\xc4\xe2\x79\xb1\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x79\xb1\x08", "vbcstnesh2ps xmm1, word ptr [@ax]"); - TEST("\xc4\xe2\x7d\xb1\x08", "vbcstnesh2ps ymm1, word ptr [@ax]"); - TEST("\xc4\xe2\x7a\xb1\xc8", "UD"); // Must have memory operand - TEST("\xc4\xe2\x7a\xb1\x08", "vbcstnebf162ps xmm1, word ptr [@ax]"); - TEST("\xc4\xe2\x7e\xb1\x08", "vbcstnebf162ps ymm1, word ptr [@ax]"); - TEST("\xc4\xe2\x7a\x72\xc1", "vcvtneps2bf16 xmm0, xmm1"); - TEST("\xc4\xe2\x7e\x72\xc1", "vcvtneps2bf16 xmm0, ymm1"); - - TEST("\xc4\xe2\xf1\xb4\xc2", "vpmadd52luq xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf5\xb4\xc2", "vpmadd52luq ymm0, ymm1, ymm2"); - TEST("\xc4\xe2\xf1\xb5\xc2", "vpmadd52huq xmm0, xmm1, xmm2"); - TEST("\xc4\xe2\xf5\xb5\xc2", "vpmadd52huq ymm0, ymm1, ymm2"); - - TEST("\xc4\xe2\x71\x92\xc0", "UD"); // Must have memory operand - TEST("\xc4\xe2\x71\x92\x00", "UD"); // Must have SIB byte - TEST("\xc4\xe2\x71\x92\x05\x00\x00\x00\x00", "UD"); // Must have SIB byte - TEST3264("\x67\xc4\xe2\x71\x92\x04\xe7", "UD", "vgatherdps xmm0, dword ptr [edi+8*xmm4], xmm1"); // VSIB + 16-bit addrsize is UD - TEST("\xc4\xe2\x71\x92\x04\xe7", "vgatherdps xmm0, dword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\x75\x92\x04\xe7", "vgatherdps ymm0, dword ptr [@di+8*ymm4], ymm1"); - TEST("\xc4\xe2\x71\x93\x04\xe7", "vgatherqps xmm0, dword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\x75\x93\x04\xe7", "vgatherqps xmm0, dword ptr [@di+8*ymm4], xmm1"); - TEST("\xc4\xe2\xf1\x92\x04\xe7", "vgatherdpd xmm0, qword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\xf5\x92\x04\xe7", "vgatherdpd ymm0, qword ptr [@di+8*xmm4], ymm1"); - TEST("\xc4\xe2\xf1\x93\x04\xe7", "vgatherqpd xmm0, qword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\xf5\x93\x04\xe7", "vgatherqpd ymm0, qword ptr [@di+8*ymm4], ymm1"); - TEST("\xc4\xe2\x71\x90\x04\xe7", "vpgatherdd xmm0, dword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\x75\x90\x04\xe7", "vpgatherdd ymm0, dword ptr [@di+8*ymm4], ymm1"); - TEST("\xc4\xe2\x71\x91\x04\xe7", "vpgatherqd xmm0, dword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\x75\x91\x04\xe7", "vpgatherqd xmm0, dword ptr [@di+8*ymm4], xmm1"); - TEST("\xc4\xe2\xf1\x90\x04\xe7", "vpgatherdq xmm0, qword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\xf5\x90\x04\xe7", "vpgatherdq ymm0, qword ptr [@di+8*xmm4], ymm1"); - TEST("\xc4\xe2\xf1\x91\x04\xe7", "vpgatherqq xmm0, qword ptr [@di+8*xmm4], xmm1"); - TEST("\xc4\xe2\xf5\x91\x04\xe7", "vpgatherqq ymm0, qword ptr [@di+8*ymm4], ymm1"); - - TEST("\xc4\xe2\x7d\x5a\x20", "vbroadcasti128 ymm4, xmmword ptr [@ax]"); - TEST64("\xc4\x62\x7d\x5a\x20", "vbroadcasti128 ymm12, xmmword ptr [rax]"); - TEST("\xc4\xe2\x75\x5a\x20", "UD"); // VEX.vvvv != 1111 - TEST("\xc4\xe2\x7d\x5a\xc0", "UD"); // ModRM.mod != 11 - TEST("\xc4\xe2\x79\x5a\x20", "UD"); // VEX.L != 1 - TEST("\xc4\xe2\xfd\x5a\x20", "UD"); // VEX.W != 0 - - // Intel-Syntax special cases - TEST("\x66\x98", "cbw"); - TEST("\x98", "cwde"); - TEST64("\x48\x98", "cdqe"); - TEST("\x66\x99", "cwd"); - TEST("\x99", "cdq"); - TEST64("\x48\x99", "cqo"); - - TEST("\x0f\xae\x00", "fxsave [@ax]"); - TEST64("\x48\x0f\xae\x00", "fxsave64 [rax]"); - TEST("\x0f\xae\x08", "fxrstor [@ax]"); - TEST64("\x48\x0f\xae\x08", "fxrstor64 [rax]"); - TEST("\x0f\xae\x20", "xsave [@ax]"); - TEST64("\x48\x0f\xae\x20", "xsave64 [rax]"); - TEST("\x0f\xc7\x20", "xsavec [@ax]"); - TEST64("\x48\x0f\xc7\x20", "xsavec64 [rax]"); - TEST("\x0f\xae\x30", "xsaveopt [@ax]"); - TEST64("\x48\x0f\xae\x30", "xsaveopt64 [rax]"); - TEST("\x0f\xc7\x28", "xsaves [@ax]"); - TEST64("\x48\x0f\xc7\x28", "xsaves64 [rax]"); - TEST("\x0f\xae\x28", "xrstor [@ax]"); - TEST64("\x48\x0f\xae\x28", "xrstor64 [rax]"); - TEST("\x0f\xc7\x18", "xrstors [@ax]"); - TEST64("\x48\x0f\xc7\x18", "xrstors64 [rax]"); - TEST("\xff\xe0", "jmp @ax"); - TEST3264("\x66\xff\xe0", "jmp ax", "jmp rax"); - TEST64("\x48\xff\xe0", "jmp rax"); - TEST("\xff\xd0", "call @ax"); - TEST3264("\x66\xff\xd0", "call ax", "call rax"); - TEST64("\x48\xff\xd0", "call rax"); - TEST3264("\x66\x70\x00", "jow 0x3", "jo 0x3"); - TEST("\xe3\xfe", "j@cxz 0x0"); - TEST3264("\x67\xe3\xfd", "jcxz 0x0", "jecxz 0x0"); - TEST3264("\xff\x20", "jmp dword ptr [eax]", "jmp qword ptr [rax]"); - TEST3264("\x66\xff\x20", "jmp word ptr [eax]", "jmp qword ptr [rax]"); - TEST64("\x48\xff\x20", "jmp qword ptr [rax]"); - TEST("\xff\x28", "jmp far fword ptr [@ax]"); - TEST("\x66\xff\x28", "jmp far dword ptr [@ax]"); - TEST64("\x48\xff\x28", "jmp far tbyte ptr [rax]"); - TEST3264("\xea\x11\x22\x33\x44\x55\x66", "jmp far 0x6655:0x44332211", "UD"); - TEST3264("\x66\xea\x11\x22\x33\x44", "jmp far 0x4433:0x2211", "UD"); - TEST32("\x66\x9a\x23\x01\x23\x00", "call far 0x23:0x123"); - TEST32("\x9a\x67\x45\x23\x01\x23\x00", "call far 0x23:0x1234567"); - TEST32("\x9a\xff\xff\xff\xff\xff\xff", "call far 0xffff:0xffffffff"); - TEST("\x66\xff\x1f", "call far dword ptr [@di]"); - TEST("\xff\x1f", "call far fword ptr [@di]"); - TEST64("\x48\xff\x1f", "call far tbyte ptr [rdi]"); - TEST("\x0f\xb4", "PARTIAL"); - TEST("\x66\x0f\xb4\x07", "lfs ax, dword ptr [@di]"); - TEST("\x0f\xb4\x07", "lfs eax, fword ptr [@di]"); - TEST64("\x48\x0f\xb4\x07", "lfs rax, tbyte ptr [rdi]"); - TEST("\xa5", "movsd"); - TEST("\x64\xa5", "fs movsd"); - TEST3264("\x2e\xa5", "cs movsd", "movsd"); - TEST3264("\x67\xa5", "addr16 movsd", "addr32 movsd"); - TEST("\xaf", "scasd"); - TEST("\x64\xaf", "scasd"); // SCAS doesn't use segment overrides - TEST("\xec", "inb"); - TEST("\x66\xed", "inw"); - TEST("\xed", "ind"); - // TEST64("\x48\xed", "ind"); // TODO - // TEST64("\x66\x48\xed", "ind"); // TODO - TEST("\xee", "outb"); - TEST("\x66\xef", "outw"); - TEST("\xef", "outd"); - // TEST64("\x48\xef", "outd"); // TODO - // TEST64("\x66\x48\xef", "outd"); // TODO - TEST("\xe4\x00", "in al, 0x0"); - TEST("\xe4\xff", "in al, 0xff"); - TEST("\x66\xe5\xff", "in ax, 0xff"); - TEST("\xe5\xff", "in eax, 0xff"); - // TEST64("\x66\x48\xe5\xff", "in eax, 0xff"); // TODO - // TEST64("\x48\xe5\xff", "in eax, 0xff"); // TODO - TEST("\xe6\x00", "out al, 0x0"); - TEST("\xe6\xff", "out al, 0xff"); - TEST("\x66\xe7\xff", "out ax, 0xff"); - TEST("\xe7\xff", "out eax, 0xff"); - // TEST64("\x66\x48\xe7\xff", "out eax, 0xff"); // TODO - // TEST64("\x48\xe7\xff", "out eax, 0xff"); // TODO - TEST32("\x66\x61", "popaw"); - TEST32("\x61", "popad"); - TEST("\x66\x9c", "pushfw"); - TEST3264("\x9c", "pushfd", "pushfq"); - TEST("\x66\x9d", "popfw"); - TEST3264("\x9d", "popfd", "popfq"); - TEST("\x66\xcf", "iretw"); - TEST("\xcf", "iretd"); - TEST64("\x48\xcf", "iretq"); - TEST32("\x06", "push es"); - TEST32("\x66\x06", "pushw es"); - TEST32("\x07", "pop es"); - TEST32("\x66\x07", "popw es"); - TEST32("\x0e", "push cs"); - TEST32("\x66\x0e", "pushw cs"); - TEST32("\x16", "push ss"); - TEST32("\x66\x16", "pushw ss"); - TEST32("\x17", "pop ss"); - TEST32("\x66\x17", "popw ss"); - TEST("\x0f\xa8", "push gs"); - TEST("\x66\x0f\xa8", "pushw gs"); - TEST("\x0f\xa9", "pop gs"); - TEST("\x66\x0f\xa9", "popw gs"); - TEST("\x0f\x21\xd0", "mov @ax, dr2"); - TEST32("\x62\x00", "bound eax, qword ptr [eax]"); - TEST32("\x66\x62\x00", "bound ax, dword ptr [eax]"); - TEST("\x0f\xae\x38", "clflush byte ptr [@ax]"); - TEST("\xdd\x00", "fld qword ptr [@ax]"); - TEST("\xdb\x28", "fld tbyte ptr [@ax]"); - TEST("\xd9\x20", "fldenv [@ax]"); - - // MPX -#if 0 - TEST("\x66\x0f\x1a\xc1", "bndmov bnd0, bnd1"); - TEST("\x66\x0f\x1a\xc4", "UD"); // ModRM bnd4 is undefined - TEST64("\x41\x66\x0f\x1a\xc0", "UD"); // ModRM bnd8 is undefined - TEST("\xf3\x0f\x1b\x00", "bndmk bnd0, [@ax]"); - TEST64("\x0f\x1a\x05\x00\x00\x00\x00", "UD"); // BNDSTX+RIP-rel = UD - TEST64("\x0f\x1b\x05\x00\x00\x00\x00", "UD"); // BNDLDX+RIP-rel = UD - TEST64("\xf3\x0f\x1b\x05\x00\x00\x00\x00", "UD"); // BNDMK+RIP-rel = UD -#endif - TEST("\xf3\x0f\x1b\xc0", "nop eax, eax"); // BNDMK with reg/reg remains NOP - - // 3DNow! - TEST("\x0f\x0f\xc0\x00", "UD"); - TEST("\x0f\x0f\xc0\x0c", "3dnow mm0, mm0, 0xc"); // PI2FW - TEST("\x0f\x0f\xc0\x0d", "3dnow mm0, mm0, 0xd"); // PI2FD - TEST("\x0f\x0f\xc0\x0e", "UD"); - TEST("\x0f\x0f\xc0\x1c", "3dnow mm0, mm0, 0x1c"); // PF2IW - TEST("\x0f\x0f\xc0\x1d", "3dnow mm0, mm0, 0x1d"); // PF2ID - TEST("\x0f\x0f\xc0\x42", "UD"); - TEST("\x0f\x0f\xc0\x80", "UD"); - TEST("\x0f\x0f\xc0\x8a", "3dnow mm0, mm0, 0x8a"); // PFNACC - TEST("\x0f\x0f\xc0\xa0", "3dnow mm0, mm0, 0xa0"); // PFCMPGT - TEST("\x0f\x0f\xc0\xb6", "3dnow mm0, mm0, 0xb6"); // PFRCPIT2 - TEST("\x0f\x0f\xc0\xbf", "3dnow mm0, mm0, 0xbf"); // PAVGUSB - - TEST("\x0f\x01\xfc", "clzero eax"); - TEST("\x66\x0f\x01\xfc", "clzero ax"); - TEST64("\x48\x0f\x01\xfc", "clzero rax"); - - // VIA PadLock - TEST("\x0f\xa7\xc0", "xstore"); - TEST("\xf3\x0f\xa7\xc0", "rep xstore"); - TEST("\xf2\x0f\xa7\xc0", "UD"); - TEST("\x0f\xa7\xe8 ", "UD"); - TEST("\xf2\x0f\xa7\xe8", "UD"); - TEST("\xf3\x0f\xa7\xe8", "rep xcryptofb"); - - // Maximum instruction length is 15 bytes. - TEST("\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x90", "PARTIAL"); - - // AMX - TEST64("\xc4\xe2\x78\x49\x00", "ldtilecfg [rax]"); - TEST64("\xc4\xe2\x79\x49\x00", "sttilecfg [rax]"); - TEST64("\xc4\xe2\x78\x49\xc0", "tilerelease"); - TEST64("\xc4\xe2\x7b\x49\x00", "UD"); // ModRM.mod != 11 - TEST64("\xc4\xe2\x7b\x49\xc0", "tilezero tmm0"); - TEST64("\xc4\xe2\x7b\x49\xc1", "UD"); // ModRM.rm != 0 - TEST64("\xc4\xe2\x7b\x49\xc7", "UD"); // ModRM.rm != 0 - TEST64("\xc4\xe2\x7b\x49\xc8", "tilezero tmm1"); - TEST64("\xc4\xe2\x7b\x49\xf8", "tilezero tmm7"); - TEST64("\xc4\x02\x7b\x49\xf8", "tilezero tmm7"); // VEX.RXB ignored - TEST64("\xc4\xe2\x7b\x4b\x04\x10", "tileloadd tmm0, [rax+1*rdx]"); - TEST64("\xc4\xe2\x7b\x4b\x04\x20", "tileloadd tmm0, [rax]"); // riz - TEST64("\xc4\x02\x7b\x4b\x3c\x10", "tileloadd tmm7, [r8+1*r10]"); // VEX.R ignored - TEST64("\xc4\xe2\x7b\x4b\x00", "UD"); // must have SIB byte - TEST64("\xc4\xe2\x7b\x4b\xff", "UD"); // must have memory operand - TEST64("\xc4\xe2\x79\x4b\x04\x10", "tileloaddt1 tmm0, [rax+1*rdx]"); - TEST64("\xc4\xe2\x79\x4b\x04\x20", "tileloaddt1 tmm0, [rax]"); // riz - TEST64("\xc4\x02\x79\x4b\x3c\x10", "tileloaddt1 tmm7, [r8+1*r10]"); // VEX.R ignored - TEST64("\xc4\xe2\x79\x4b\x00", "UD"); // must have SIB byte - TEST64("\xc4\xe2\x79\x4b\xff", "UD"); // must have memory operand - TEST64("\xc4\xe2\x7a\x4b\x04\x10", "tilestored [rax+1*rdx], tmm0"); - TEST64("\xc4\xe2\x7a\x4b\x04\x20", "tilestored [rax], tmm0"); // riz - TEST64("\xc4\x02\x7a\x4b\x3c\x10", "tilestored [r8+1*r10], tmm7"); // VEX.R ignored - TEST64("\xc4\xe2\x7a\x4b\x00", "UD"); // must have SIB byte - TEST64("\xc4\xe2\x7a\x4b\xff", "UD"); // must have memory operand - TEST64("\xc4\xe2\x68\x5e\x00", "UD"); // must have register operand - TEST64("\xc4\xe2\x68\x5e\xc8", "tdpbuud tmm1, tmm0, tmm2"); - TEST64("\xc4\x02\x28\x5e\xc8", "tdpbuud tmm1, tmm0, tmm2"); // VEX.RBV3 ignored - // TODO: enforce that all registers must be different - //TEST64("\xc4\xe2\x68\x5e\xc0", "UD"); // ModRM.rm == ModRM.reg - //TEST64("\xc4\xe2\x68\x5e\xca", "UD"); // ModRM.rm == VEX.vvvv - //TEST64("\xc4\xe2\x68\x5e\xd0", "UD"); // ModRM.reg == VEX.vvvv - TEST64("\xc4\xe2\x6a\x5c\xc8", "tdpbf16ps tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x6b\x5c\xc8", "tdpfp16ps tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x68\x5e\xc8", "tdpbuud tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x69\x5e\xc8", "tdpbusd tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x6a\x5e\xc8", "tdpbsud tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x6b\x5e\xc8", "tdpbssd tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x68\x6c\xc8", "tcmmrlfp16ps tmm1, tmm0, tmm2"); - TEST64("\xc4\xe2\x69\x6c\xc8", "tcmmimfp16ps tmm1, tmm0, tmm2"); - - // Complete test of VADDPS and all encoding options - TEST("\x62", "PARTIAL"); - TEST("\x62\xf1", "PARTIAL"); - TEST("\x62\xf1\x74", "PARTIAL"); - TEST("\x62\xf1\x74\x18", "PARTIAL"); - TEST("\x62\xf1\x74\x18\x58", "PARTIAL"); - TEST("\x62\xf1\x74\x18\x58\xc2", "vaddps zmm0, zmm1, zmm2, {rn-sae}"); - TEST("\x62\xf1\x74\x38\x58\xc2", "vaddps zmm0, zmm1, zmm2, {rd-sae}"); - TEST("\x62\xf1\x74\x58\x58\xc2", "vaddps zmm0, zmm1, zmm2, {ru-sae}"); - TEST("\x62\xf1\x74\x78\x58\xc2", "vaddps zmm0, zmm1, zmm2, {rz-sae}"); - TEST("\x62\xf1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2"); - TEST("\x62\xf1\x74\x09\x58\xc2", "vaddps xmm0{k1}, xmm1, xmm2"); - TEST("\x62\xf1\x74\x89\x58\xc2", "vaddps xmm0{k1}{z}, xmm1, xmm2"); - TEST("\x62\xf1\x74\x88\x58\xc2", "UD"); // EVEX.z = 1 - TEST("\x62\xf1\x74\x28\x58\xc2", "vaddps ymm0, ymm1, ymm2"); - TEST("\x62\xf1\x74\x29\x58\xc2", "vaddps ymm0{k1}, ymm1, ymm2"); - TEST("\x62\xf1\x74\xa9\x58\xc2", "vaddps ymm0{k1}{z}, ymm1, ymm2"); - TEST("\x62\xf1\x74\xa8\x58\xc2", "UD"); // EVEX.z = 1 - TEST("\x62\xf1\x74\x48\x58\xc2", "vaddps zmm0, zmm1, zmm2"); - TEST("\x62\xf1\x74\x49\x58\xc2", "vaddps zmm0{k1}, zmm1, zmm2"); - TEST("\x62\xf1\x74\xc9\x58\xc2", "vaddps zmm0{k1}{z}, zmm1, zmm2"); - TEST("\x62\xf1\x74\xc8\x58\xc2", "UD"); // EVEX.z = 1 - TEST("\x62\xf1\x74\x68\x58\xc2", "UD"); // EVEX.L'Lb = 110 TEST32("\x62\xf1\x74\x08\x58\x00", "vaddps xmm0, xmm1, xmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x08\x58\x00", "vaddps xmm0, xmm1, xmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x08\x58\x00", "vaddps xmm0, xmm1, xmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x08\x58\x00", "vaddps xmm0, xmm1, xmmword ptr [eax]"); - TEST32("\x62\xf1\x74\x0a\x58\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x0a\x58\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x0a\x58\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x0a\x58\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax]"); - TEST32("\x62\xf1\x74\x8a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x8a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x8a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x8a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax]"); - TEST32("\x62\xf1\x74\x88\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x88\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x88\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x88\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x18\x58\x00", "vaddps xmm0, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x67\x62\xf1\x74\x18\x58\x00", "vaddps xmm0, xmm1, dword ptr [bx+1*si]{1to4}"); - TEST64("\x62\xf1\x74\x18\x58\x00", "vaddps xmm0, xmm1, dword ptr [rax]{1to4}"); - TEST64("\x67\x62\xf1\x74\x18\x58\x00", "vaddps xmm0, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x62\xf1\x74\x1a\x58\x00", "vaddps xmm0{k2}, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x67\x62\xf1\x74\x1a\x58\x00", "vaddps xmm0{k2}, xmm1, dword ptr [bx+1*si]{1to4}"); - TEST64("\x62\xf1\x74\x1a\x58\x00", "vaddps xmm0{k2}, xmm1, dword ptr [rax]{1to4}"); - TEST64("\x67\x62\xf1\x74\x1a\x58\x00", "vaddps xmm0{k2}, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x62\xf1\x74\x9a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x67\x62\xf1\x74\x9a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [bx+1*si]{1to4}"); - TEST64("\x62\xf1\x74\x9a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [rax]{1to4}"); - TEST64("\x67\x62\xf1\x74\x9a\x58\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax]{1to4}"); - TEST32("\x62\xf1\x74\x98\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x98\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x98\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x98\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x28\x58\x00", "vaddps ymm0, ymm1, ymmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x28\x58\x00", "vaddps ymm0, ymm1, ymmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x28\x58\x00", "vaddps ymm0, ymm1, ymmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x28\x58\x00", "vaddps ymm0, ymm1, ymmword ptr [eax]"); - TEST32("\x62\xf1\x74\x2a\x58\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x2a\x58\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x2a\x58\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x2a\x58\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax]"); - TEST32("\x62\xf1\x74\xaa\x58\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\xaa\x58\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\xaa\x58\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\xaa\x58\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax]"); - TEST32("\x62\xf1\x74\xa8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xa8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xa8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xa8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x38\x58\x00", "vaddps ymm0, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x67\x62\xf1\x74\x38\x58\x00", "vaddps ymm0, ymm1, dword ptr [bx+1*si]{1to8}"); - TEST64("\x62\xf1\x74\x38\x58\x00", "vaddps ymm0, ymm1, dword ptr [rax]{1to8}"); - TEST64("\x67\x62\xf1\x74\x38\x58\x00", "vaddps ymm0, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x62\xf1\x74\x3a\x58\x00", "vaddps ymm0{k2}, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x67\x62\xf1\x74\x3a\x58\x00", "vaddps ymm0{k2}, ymm1, dword ptr [bx+1*si]{1to8}"); - TEST64("\x62\xf1\x74\x3a\x58\x00", "vaddps ymm0{k2}, ymm1, dword ptr [rax]{1to8}"); - TEST64("\x67\x62\xf1\x74\x3a\x58\x00", "vaddps ymm0{k2}, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x62\xf1\x74\xba\x58\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x67\x62\xf1\x74\xba\x58\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [bx+1*si]{1to8}"); - TEST64("\x62\xf1\x74\xba\x58\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [rax]{1to8}"); - TEST64("\x67\x62\xf1\x74\xba\x58\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax]{1to8}"); - TEST32("\x62\xf1\x74\xb8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xb8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xb8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xb8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x48\x58\x00", "vaddps zmm0, zmm1, zmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x48\x58\x00", "vaddps zmm0, zmm1, zmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x48\x58\x00", "vaddps zmm0, zmm1, zmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x48\x58\x00", "vaddps zmm0, zmm1, zmmword ptr [eax]"); - TEST32("\x62\xf1\x74\x4a\x58\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\x4a\x58\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\x4a\x58\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\x4a\x58\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax]"); - TEST32("\x62\xf1\x74\xca\x58\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax]"); - TEST32("\x67\x62\xf1\x74\xca\x58\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [bx+1*si]"); - TEST64("\x62\xf1\x74\xca\x58\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [rax]"); - TEST64("\x67\x62\xf1\x74\xca\x58\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax]"); - TEST32("\x62\xf1\x74\xc8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xc8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xc8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xc8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x58\x58\x00", "vaddps zmm0, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x67\x62\xf1\x74\x58\x58\x00", "vaddps zmm0, zmm1, dword ptr [bx+1*si]{1to16}"); - TEST64("\x62\xf1\x74\x58\x58\x00", "vaddps zmm0, zmm1, dword ptr [rax]{1to16}"); - TEST64("\x67\x62\xf1\x74\x58\x58\x00", "vaddps zmm0, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x62\xf1\x74\x5a\x58\x00", "vaddps zmm0{k2}, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x67\x62\xf1\x74\x5a\x58\x00", "vaddps zmm0{k2}, zmm1, dword ptr [bx+1*si]{1to16}"); - TEST64("\x62\xf1\x74\x5a\x58\x00", "vaddps zmm0{k2}, zmm1, dword ptr [rax]{1to16}"); - TEST64("\x67\x62\xf1\x74\x5a\x58\x00", "vaddps zmm0{k2}, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x62\xf1\x74\xda\x58\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x67\x62\xf1\x74\xda\x58\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [bx+1*si]{1to16}"); - TEST64("\x62\xf1\x74\xda\x58\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [rax]{1to16}"); - TEST64("\x67\x62\xf1\x74\xda\x58\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax]{1to16}"); - TEST32("\x62\xf1\x74\xd8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xd8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xd8\x58\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xd8\x58\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x68\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x68\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x68\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x68\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x6a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x6a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x6a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x6a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xea\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xea\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xea\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xea\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xe8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xe8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xe8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xe8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x78\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x78\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x78\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x78\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x7a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x7a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x7a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x7a\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xfa\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xfa\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xfa\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xfa\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xf8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xf8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xf8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xf8\x58\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x08\x58\x40\x01", "vaddps xmm0, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x67\x62\xf1\x74\x08\x58\x40\x01", "vaddps xmm0, xmm1, xmmword ptr [bx+1*si+0x10]"); - TEST64("\x62\xf1\x74\x08\x58\x40\x01", "vaddps xmm0, xmm1, xmmword ptr [rax+0x10]"); - TEST64("\x67\x62\xf1\x74\x08\x58\x40\x01", "vaddps xmm0, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x62\xf1\x74\x0a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x67\x62\xf1\x74\x0a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, xmmword ptr [bx+1*si+0x10]"); - TEST64("\x62\xf1\x74\x0a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, xmmword ptr [rax+0x10]"); - TEST64("\x67\x62\xf1\x74\x0a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x62\xf1\x74\x8a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x67\x62\xf1\x74\x8a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [bx+1*si+0x10]"); - TEST64("\x62\xf1\x74\x8a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [rax+0x10]"); - TEST64("\x67\x62\xf1\x74\x8a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax+0x10]"); - TEST32("\x62\xf1\x74\x88\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x88\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x88\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x88\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x18\x58\x40\x01", "vaddps xmm0, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x18\x58\x40\x01", "vaddps xmm0, xmm1, dword ptr [bx+1*si+0x4]{1to4}"); - TEST64("\x62\xf1\x74\x18\x58\x40\x01", "vaddps xmm0, xmm1, dword ptr [rax+0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x18\x58\x40\x01", "vaddps xmm0, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x62\xf1\x74\x1a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x1a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, dword ptr [bx+1*si+0x4]{1to4}"); - TEST64("\x62\xf1\x74\x1a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, dword ptr [rax+0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x1a\x58\x40\x01", "vaddps xmm0{k2}, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x62\xf1\x74\x9a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x9a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, dword ptr [bx+1*si+0x4]{1to4}"); - TEST64("\x62\xf1\x74\x9a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, dword ptr [rax+0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x9a\x58\x40\x01", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax+0x4]{1to4}"); - TEST32("\x62\xf1\x74\x98\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x98\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x98\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x98\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x28\x58\x40\x01", "vaddps ymm0, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x67\x62\xf1\x74\x28\x58\x40\x01", "vaddps ymm0, ymm1, ymmword ptr [bx+1*si+0x20]"); - TEST64("\x62\xf1\x74\x28\x58\x40\x01", "vaddps ymm0, ymm1, ymmword ptr [rax+0x20]"); - TEST64("\x67\x62\xf1\x74\x28\x58\x40\x01", "vaddps ymm0, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x62\xf1\x74\x2a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x67\x62\xf1\x74\x2a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, ymmword ptr [bx+1*si+0x20]"); - TEST64("\x62\xf1\x74\x2a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, ymmword ptr [rax+0x20]"); - TEST64("\x67\x62\xf1\x74\x2a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x62\xf1\x74\xaa\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x67\x62\xf1\x74\xaa\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [bx+1*si+0x20]"); - TEST64("\x62\xf1\x74\xaa\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [rax+0x20]"); - TEST64("\x67\x62\xf1\x74\xaa\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax+0x20]"); - TEST32("\x62\xf1\x74\xa8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xa8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xa8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xa8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x38\x58\x40\x01", "vaddps ymm0, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\x38\x58\x40\x01", "vaddps ymm0, ymm1, dword ptr [bx+1*si+0x4]{1to8}"); - TEST64("\x62\xf1\x74\x38\x58\x40\x01", "vaddps ymm0, ymm1, dword ptr [rax+0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\x38\x58\x40\x01", "vaddps ymm0, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x62\xf1\x74\x3a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\x3a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, dword ptr [bx+1*si+0x4]{1to8}"); - TEST64("\x62\xf1\x74\x3a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, dword ptr [rax+0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\x3a\x58\x40\x01", "vaddps ymm0{k2}, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x62\xf1\x74\xba\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\xba\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, dword ptr [bx+1*si+0x4]{1to8}"); - TEST64("\x62\xf1\x74\xba\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, dword ptr [rax+0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\xba\x58\x40\x01", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax+0x4]{1to8}"); - TEST32("\x62\xf1\x74\xb8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xb8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xb8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xb8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x48\x58\x40\x01", "vaddps zmm0, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x67\x62\xf1\x74\x48\x58\x40\x01", "vaddps zmm0, zmm1, zmmword ptr [bx+1*si+0x40]"); - TEST64("\x62\xf1\x74\x48\x58\x40\x01", "vaddps zmm0, zmm1, zmmword ptr [rax+0x40]"); - TEST64("\x67\x62\xf1\x74\x48\x58\x40\x01", "vaddps zmm0, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x62\xf1\x74\x4a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x67\x62\xf1\x74\x4a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, zmmword ptr [bx+1*si+0x40]"); - TEST64("\x62\xf1\x74\x4a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, zmmword ptr [rax+0x40]"); - TEST64("\x67\x62\xf1\x74\x4a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x62\xf1\x74\xca\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x67\x62\xf1\x74\xca\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [bx+1*si+0x40]"); - TEST64("\x62\xf1\x74\xca\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [rax+0x40]"); - TEST64("\x67\x62\xf1\x74\xca\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax+0x40]"); - TEST32("\x62\xf1\x74\xc8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xc8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xc8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xc8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x58\x58\x40\x01", "vaddps zmm0, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\x58\x58\x40\x01", "vaddps zmm0, zmm1, dword ptr [bx+1*si+0x4]{1to16}"); - TEST64("\x62\xf1\x74\x58\x58\x40\x01", "vaddps zmm0, zmm1, dword ptr [rax+0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\x58\x58\x40\x01", "vaddps zmm0, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x62\xf1\x74\x5a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\x5a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, dword ptr [bx+1*si+0x4]{1to16}"); - TEST64("\x62\xf1\x74\x5a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, dword ptr [rax+0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\x5a\x58\x40\x01", "vaddps zmm0{k2}, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x62\xf1\x74\xda\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\xda\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, dword ptr [bx+1*si+0x4]{1to16}"); - TEST64("\x62\xf1\x74\xda\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, dword ptr [rax+0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\xda\x58\x40\x01", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax+0x4]{1to16}"); - TEST32("\x62\xf1\x74\xd8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xd8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xd8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xd8\x58\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x68\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x68\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x68\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x68\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x6a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x6a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x6a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x6a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xea\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xea\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xea\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xea\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xe8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xe8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xe8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xe8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x78\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x78\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x78\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x78\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x7a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x7a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x7a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x7a\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xfa\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xfa\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xfa\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xfa\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xf8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xf8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xf8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xf8\x58\x40\x01", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x08\x58\x40\xff", "vaddps xmm0, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x67\x62\xf1\x74\x08\x58\x40\xff", "vaddps xmm0, xmm1, xmmword ptr [bx+1*si-0x10]"); - TEST64("\x62\xf1\x74\x08\x58\x40\xff", "vaddps xmm0, xmm1, xmmword ptr [rax-0x10]"); - TEST64("\x67\x62\xf1\x74\x08\x58\x40\xff", "vaddps xmm0, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x62\xf1\x74\x0a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x67\x62\xf1\x74\x0a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, xmmword ptr [bx+1*si-0x10]"); - TEST64("\x62\xf1\x74\x0a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, xmmword ptr [rax-0x10]"); - TEST64("\x67\x62\xf1\x74\x0a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x62\xf1\x74\x8a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x67\x62\xf1\x74\x8a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [bx+1*si-0x10]"); - TEST64("\x62\xf1\x74\x8a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [rax-0x10]"); - TEST64("\x67\x62\xf1\x74\x8a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax-0x10]"); - TEST32("\x62\xf1\x74\x88\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x88\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x88\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x88\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x18\x58\x40\xff", "vaddps xmm0, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x18\x58\x40\xff", "vaddps xmm0, xmm1, dword ptr [bx+1*si-0x4]{1to4}"); - TEST64("\x62\xf1\x74\x18\x58\x40\xff", "vaddps xmm0, xmm1, dword ptr [rax-0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x18\x58\x40\xff", "vaddps xmm0, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x62\xf1\x74\x1a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x1a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, dword ptr [bx+1*si-0x4]{1to4}"); - TEST64("\x62\xf1\x74\x1a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, dword ptr [rax-0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x1a\x58\x40\xff", "vaddps xmm0{k2}, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x62\xf1\x74\x9a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x67\x62\xf1\x74\x9a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, dword ptr [bx+1*si-0x4]{1to4}"); - TEST64("\x62\xf1\x74\x9a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, dword ptr [rax-0x4]{1to4}"); - TEST64("\x67\x62\xf1\x74\x9a\x58\x40\xff", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax-0x4]{1to4}"); - TEST32("\x62\xf1\x74\x98\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x98\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x98\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x98\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x28\x58\x40\xff", "vaddps ymm0, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x67\x62\xf1\x74\x28\x58\x40\xff", "vaddps ymm0, ymm1, ymmword ptr [bx+1*si-0x20]"); - TEST64("\x62\xf1\x74\x28\x58\x40\xff", "vaddps ymm0, ymm1, ymmword ptr [rax-0x20]"); - TEST64("\x67\x62\xf1\x74\x28\x58\x40\xff", "vaddps ymm0, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x62\xf1\x74\x2a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x67\x62\xf1\x74\x2a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, ymmword ptr [bx+1*si-0x20]"); - TEST64("\x62\xf1\x74\x2a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, ymmword ptr [rax-0x20]"); - TEST64("\x67\x62\xf1\x74\x2a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x62\xf1\x74\xaa\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x67\x62\xf1\x74\xaa\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [bx+1*si-0x20]"); - TEST64("\x62\xf1\x74\xaa\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [rax-0x20]"); - TEST64("\x67\x62\xf1\x74\xaa\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax-0x20]"); - TEST32("\x62\xf1\x74\xa8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xa8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xa8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xa8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x38\x58\x40\xff", "vaddps ymm0, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\x38\x58\x40\xff", "vaddps ymm0, ymm1, dword ptr [bx+1*si-0x4]{1to8}"); - TEST64("\x62\xf1\x74\x38\x58\x40\xff", "vaddps ymm0, ymm1, dword ptr [rax-0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\x38\x58\x40\xff", "vaddps ymm0, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x62\xf1\x74\x3a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\x3a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, dword ptr [bx+1*si-0x4]{1to8}"); - TEST64("\x62\xf1\x74\x3a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, dword ptr [rax-0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\x3a\x58\x40\xff", "vaddps ymm0{k2}, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x62\xf1\x74\xba\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x67\x62\xf1\x74\xba\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, dword ptr [bx+1*si-0x4]{1to8}"); - TEST64("\x62\xf1\x74\xba\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, dword ptr [rax-0x4]{1to8}"); - TEST64("\x67\x62\xf1\x74\xba\x58\x40\xff", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax-0x4]{1to8}"); - TEST32("\x62\xf1\x74\xb8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xb8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xb8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xb8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x48\x58\x40\xff", "vaddps zmm0, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x67\x62\xf1\x74\x48\x58\x40\xff", "vaddps zmm0, zmm1, zmmword ptr [bx+1*si-0x40]"); - TEST64("\x62\xf1\x74\x48\x58\x40\xff", "vaddps zmm0, zmm1, zmmword ptr [rax-0x40]"); - TEST64("\x67\x62\xf1\x74\x48\x58\x40\xff", "vaddps zmm0, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x62\xf1\x74\x4a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x67\x62\xf1\x74\x4a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, zmmword ptr [bx+1*si-0x40]"); - TEST64("\x62\xf1\x74\x4a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, zmmword ptr [rax-0x40]"); - TEST64("\x67\x62\xf1\x74\x4a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x62\xf1\x74\xca\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x67\x62\xf1\x74\xca\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [bx+1*si-0x40]"); - TEST64("\x62\xf1\x74\xca\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [rax-0x40]"); - TEST64("\x67\x62\xf1\x74\xca\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax-0x40]"); - TEST32("\x62\xf1\x74\xc8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xc8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xc8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xc8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x58\x58\x40\xff", "vaddps zmm0, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\x58\x58\x40\xff", "vaddps zmm0, zmm1, dword ptr [bx+1*si-0x4]{1to16}"); - TEST64("\x62\xf1\x74\x58\x58\x40\xff", "vaddps zmm0, zmm1, dword ptr [rax-0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\x58\x58\x40\xff", "vaddps zmm0, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x62\xf1\x74\x5a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\x5a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, dword ptr [bx+1*si-0x4]{1to16}"); - TEST64("\x62\xf1\x74\x5a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, dword ptr [rax-0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\x5a\x58\x40\xff", "vaddps zmm0{k2}, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x62\xf1\x74\xda\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x67\x62\xf1\x74\xda\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, dword ptr [bx+1*si-0x4]{1to16}"); - TEST64("\x62\xf1\x74\xda\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, dword ptr [rax-0x4]{1to16}"); - TEST64("\x67\x62\xf1\x74\xda\x58\x40\xff", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax-0x4]{1to16}"); - TEST32("\x62\xf1\x74\xd8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xd8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xd8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xd8\x58\x40\xff", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x68\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x68\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x68\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x68\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x6a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x6a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x6a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x6a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xea\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xea\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xea\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xea\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xe8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xe8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xe8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xe8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x78\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x78\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x78\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x78\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x7a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x7a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x7a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x7a\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xfa\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xfa\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xfa\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xfa\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xf8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xf8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xf8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xf8\x58\x40\xff", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x08\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x08\x58\x80\x01\x00", "vaddps xmm0, xmm1, xmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x08\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, xmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x08\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\x0a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x0a\x58\x80\x01\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x0a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x0a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\x8a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x8a\x58\x80\x01\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x8a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x8a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, xmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\x88\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x88\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x88\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x88\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x18\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x67\x62\xf1\x74\x18\x58\x80\x01\x00", "vaddps xmm0, xmm1, dword ptr [bx+1*si+0x1]{1to4}"); - TEST64("\x62\xf1\x74\x18\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, dword ptr [rax+0x1]{1to4}"); - TEST64("\x67\x62\xf1\x74\x18\x58\x80\x01\x00\x00\x00", "vaddps xmm0, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x62\xf1\x74\x1a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x67\x62\xf1\x74\x1a\x58\x80\x01\x00", "vaddps xmm0{k2}, xmm1, dword ptr [bx+1*si+0x1]{1to4}"); - TEST64("\x62\xf1\x74\x1a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, dword ptr [rax+0x1]{1to4}"); - TEST64("\x67\x62\xf1\x74\x1a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x62\xf1\x74\x9a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x67\x62\xf1\x74\x9a\x58\x80\x01\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [bx+1*si+0x1]{1to4}"); - TEST64("\x62\xf1\x74\x9a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [rax+0x1]{1to4}"); - TEST64("\x67\x62\xf1\x74\x9a\x58\x80\x01\x00\x00\x00", "vaddps xmm0{k2}{z}, xmm1, dword ptr [eax+0x1]{1to4}"); - TEST32("\x62\xf1\x74\x98\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\x98\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\x98\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\x98\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x28\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x28\x58\x80\x01\x00", "vaddps ymm0, ymm1, ymmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x28\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, ymmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x28\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\x2a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x2a\x58\x80\x01\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x2a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x2a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\xaa\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\xaa\x58\x80\x01\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\xaa\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\xaa\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, ymmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\xa8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xa8\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xa8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xa8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x38\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x67\x62\xf1\x74\x38\x58\x80\x01\x00", "vaddps ymm0, ymm1, dword ptr [bx+1*si+0x1]{1to8}"); - TEST64("\x62\xf1\x74\x38\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, dword ptr [rax+0x1]{1to8}"); - TEST64("\x67\x62\xf1\x74\x38\x58\x80\x01\x00\x00\x00", "vaddps ymm0, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x62\xf1\x74\x3a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x67\x62\xf1\x74\x3a\x58\x80\x01\x00", "vaddps ymm0{k2}, ymm1, dword ptr [bx+1*si+0x1]{1to8}"); - TEST64("\x62\xf1\x74\x3a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, dword ptr [rax+0x1]{1to8}"); - TEST64("\x67\x62\xf1\x74\x3a\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x62\xf1\x74\xba\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x67\x62\xf1\x74\xba\x58\x80\x01\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [bx+1*si+0x1]{1to8}"); - TEST64("\x62\xf1\x74\xba\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [rax+0x1]{1to8}"); - TEST64("\x67\x62\xf1\x74\xba\x58\x80\x01\x00\x00\x00", "vaddps ymm0{k2}{z}, ymm1, dword ptr [eax+0x1]{1to8}"); - TEST32("\x62\xf1\x74\xb8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xb8\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xb8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xb8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x48\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x48\x58\x80\x01\x00", "vaddps zmm0, zmm1, zmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x48\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, zmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x48\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\x4a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\x4a\x58\x80\x01\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\x4a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\x4a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\xca\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x67\x62\xf1\x74\xca\x58\x80\x01\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [bx+1*si+0x1]"); - TEST64("\x62\xf1\x74\xca\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [rax+0x1]"); - TEST64("\x67\x62\xf1\x74\xca\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, zmmword ptr [eax+0x1]"); - TEST32("\x62\xf1\x74\xc8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xc8\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xc8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xc8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x58\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x67\x62\xf1\x74\x58\x58\x80\x01\x00", "vaddps zmm0, zmm1, dword ptr [bx+1*si+0x1]{1to16}"); - TEST64("\x62\xf1\x74\x58\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, dword ptr [rax+0x1]{1to16}"); - TEST64("\x67\x62\xf1\x74\x58\x58\x80\x01\x00\x00\x00", "vaddps zmm0, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x62\xf1\x74\x5a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x67\x62\xf1\x74\x5a\x58\x80\x01\x00", "vaddps zmm0{k2}, zmm1, dword ptr [bx+1*si+0x1]{1to16}"); - TEST64("\x62\xf1\x74\x5a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, dword ptr [rax+0x1]{1to16}"); - TEST64("\x67\x62\xf1\x74\x5a\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x62\xf1\x74\xda\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x67\x62\xf1\x74\xda\x58\x80\x01\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [bx+1*si+0x1]{1to16}"); - TEST64("\x62\xf1\x74\xda\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [rax+0x1]{1to16}"); - TEST64("\x67\x62\xf1\x74\xda\x58\x80\x01\x00\x00\x00", "vaddps zmm0{k2}{z}, zmm1, dword ptr [eax+0x1]{1to16}"); - TEST32("\x62\xf1\x74\xd8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf1\x74\xd8\x58\x80\x01\x00", "UD"); // EVEX.z = 1 - TEST64("\x62\xf1\x74\xd8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf1\x74\xd8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.z = 1 - TEST32("\x62\xf1\x74\x68\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x68\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x68\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x68\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x6a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x6a\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x6a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x6a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xea\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xea\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xea\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xea\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xe8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xe8\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xe8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xe8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x78\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x78\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x78\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x78\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\x7a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\x7a\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\x7a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\x7a\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xfa\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xfa\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xfa\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xfa\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x62\xf1\x74\xf8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST32("\x67\x62\xf1\x74\xf8\x58\x80\x01\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x62\xf1\x74\xf8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - TEST64("\x67\x62\xf1\x74\xf8\x58\x80\x01\x00\x00\x00", "UD"); // EVEX.L'L = 11 - - // Test register extensions encoded in EVEX prefixs - TEST3264("\x62\xf1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm0, xmm1, xmm2"); - TEST3264("\x62\xd1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm0, xmm1, xmm10"); - TEST64("\x62\xb1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm18"); - TEST64("\x62\x91\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm26"); - TEST3264("\x62\xf1\x34\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm0, xmm9, xmm2"); - TEST3264("\x62\xd1\x34\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm0, xmm9, xmm10"); - TEST64("\x62\xb1\x34\x08\x58\xc2", "vaddps xmm0, xmm9, xmm18"); - TEST64("\x62\x91\x34\x08\x58\xc2", "vaddps xmm0, xmm9, xmm26"); - TEST3264("\x62\xf1\x74\x00\x58\xc2", "UD", "vaddps xmm0, xmm17, xmm2"); // EVEX.V' = 0 - TEST3264("\x62\xd1\x74\x00\x58\xc2", "UD", "vaddps xmm0, xmm17, xmm10"); // EVEX.V' = 0 - TEST64("\x62\xb1\x74\x00\x58\xc2", "vaddps xmm0, xmm17, xmm18"); - TEST64("\x62\x91\x74\x00\x58\xc2", "vaddps xmm0, xmm17, xmm26"); - TEST3264("\x62\xf1\x34\x00\x58\xc2", "UD", "vaddps xmm0, xmm25, xmm2"); // EVEX.V' = 0 - TEST3264("\x62\xd1\x34\x00\x58\xc2", "UD", "vaddps xmm0, xmm25, xmm10"); // EVEX.V' = 0 - TEST64("\x62\xb1\x34\x00\x58\xc2", "vaddps xmm0, xmm25, xmm18"); - TEST64("\x62\x91\x34\x00\x58\xc2", "vaddps xmm0, xmm25, xmm26"); - TEST64("\x62\x71\x74\x08\x58\xc2", "vaddps xmm8, xmm1, xmm2"); - TEST64("\x62\x51\x74\x08\x58\xc2", "vaddps xmm8, xmm1, xmm10"); - TEST64("\x62\x31\x74\x08\x58\xc2", "vaddps xmm8, xmm1, xmm18"); - TEST64("\x62\x11\x74\x08\x58\xc2", "vaddps xmm8, xmm1, xmm26"); - TEST64("\x62\x71\x34\x08\x58\xc2", "vaddps xmm8, xmm9, xmm2"); - TEST64("\x62\x51\x34\x08\x58\xc2", "vaddps xmm8, xmm9, xmm10"); - TEST64("\x62\x31\x34\x08\x58\xc2", "vaddps xmm8, xmm9, xmm18"); - TEST64("\x62\x11\x34\x08\x58\xc2", "vaddps xmm8, xmm9, xmm26"); - TEST64("\x62\x71\x74\x00\x58\xc2", "vaddps xmm8, xmm17, xmm2"); - TEST64("\x62\x51\x74\x00\x58\xc2", "vaddps xmm8, xmm17, xmm10"); - TEST64("\x62\x31\x74\x00\x58\xc2", "vaddps xmm8, xmm17, xmm18"); - TEST64("\x62\x11\x74\x00\x58\xc2", "vaddps xmm8, xmm17, xmm26"); - TEST64("\x62\x71\x34\x00\x58\xc2", "vaddps xmm8, xmm25, xmm2"); - TEST64("\x62\x51\x34\x00\x58\xc2", "vaddps xmm8, xmm25, xmm10"); - TEST64("\x62\x31\x34\x00\x58\xc2", "vaddps xmm8, xmm25, xmm18"); - TEST64("\x62\x11\x34\x00\x58\xc2", "vaddps xmm8, xmm25, xmm26"); - TEST3264("\x62\xe1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm16, xmm1, xmm2"); - TEST3264("\x62\xc1\x74\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm16, xmm1, xmm10"); - TEST64("\x62\xa1\x74\x08\x58\xc2", "vaddps xmm16, xmm1, xmm18"); - TEST64("\x62\x81\x74\x08\x58\xc2", "vaddps xmm16, xmm1, xmm26"); - TEST3264("\x62\xe1\x34\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm16, xmm9, xmm2"); - TEST3264("\x62\xc1\x34\x08\x58\xc2", "vaddps xmm0, xmm1, xmm2", "vaddps xmm16, xmm9, xmm10"); - TEST64("\x62\xa1\x34\x08\x58\xc2", "vaddps xmm16, xmm9, xmm18"); - TEST64("\x62\x81\x34\x08\x58\xc2", "vaddps xmm16, xmm9, xmm26"); - TEST3264("\x62\xe1\x74\x00\x58\xc2", "UD", "vaddps xmm16, xmm17, xmm2"); // EVEX.V' = 0 - TEST3264("\x62\xc1\x74\x00\x58\xc2", "UD", "vaddps xmm16, xmm17, xmm10"); // EVEX.V' = 0 - TEST64("\x62\xa1\x74\x00\x58\xc2", "vaddps xmm16, xmm17, xmm18"); - TEST64("\x62\x81\x74\x00\x58\xc2", "vaddps xmm16, xmm17, xmm26"); - TEST3264("\x62\xe1\x34\x00\x58\xc2", "UD", "vaddps xmm16, xmm25, xmm2"); // EVEX.V' = 0 - TEST3264("\x62\xc1\x34\x00\x58\xc2", "UD", "vaddps xmm16, xmm25, xmm10"); // EVEX.V' = 0 - TEST64("\x62\xa1\x34\x00\x58\xc2", "vaddps xmm16, xmm25, xmm18"); - TEST64("\x62\x81\x34\x00\x58\xc2", "vaddps xmm16, xmm25, xmm26"); - TEST64("\x62\x61\x74\x08\x58\xc2", "vaddps xmm24, xmm1, xmm2"); - TEST64("\x62\x41\x74\x08\x58\xc2", "vaddps xmm24, xmm1, xmm10"); - TEST64("\x62\x21\x74\x08\x58\xc2", "vaddps xmm24, xmm1, xmm18"); - TEST64("\x62\x01\x74\x08\x58\xc2", "vaddps xmm24, xmm1, xmm26"); - TEST64("\x62\x61\x34\x08\x58\xc2", "vaddps xmm24, xmm9, xmm2"); - TEST64("\x62\x41\x34\x08\x58\xc2", "vaddps xmm24, xmm9, xmm10"); - TEST64("\x62\x21\x34\x08\x58\xc2", "vaddps xmm24, xmm9, xmm18"); - TEST64("\x62\x01\x34\x08\x58\xc2", "vaddps xmm24, xmm9, xmm26"); - TEST64("\x62\x61\x74\x00\x58\xc2", "vaddps xmm24, xmm17, xmm2"); - TEST64("\x62\x41\x74\x00\x58\xc2", "vaddps xmm24, xmm17, xmm10"); - TEST64("\x62\x21\x74\x00\x58\xc2", "vaddps xmm24, xmm17, xmm18"); - TEST64("\x62\x01\x74\x00\x58\xc2", "vaddps xmm24, xmm17, xmm26"); - TEST64("\x62\x61\x34\x00\x58\xc2", "vaddps xmm24, xmm25, xmm2"); - TEST64("\x62\x41\x34\x00\x58\xc2", "vaddps xmm24, xmm25, xmm10"); - TEST64("\x62\x21\x34\x00\x58\xc2", "vaddps xmm24, xmm25, xmm18"); - TEST64("\x62\x01\x34\x00\x58\xc2", "vaddps xmm24, xmm25, xmm26"); - - // VMOVDDUP has special tuple size for L0. - TEST("\x62\xf1\xff\x08\x12\x48\x01", "vmovddup xmm1, qword ptr [@ax+0x8]"); - TEST("\x62\xf1\xff\x08\x12\xc8", "vmovddup xmm1, xmm0"); - TEST("\x62\xf1\xff\x28\x12\x48\x01", "vmovddup ymm1, ymmword ptr [@ax+0x20]"); - TEST("\x62\xf1\xff\x28\x12\xc8", "vmovddup ymm1, ymm0"); - TEST("\x62\xf1\xff\x48\x12\x48\x01", "vmovddup zmm1, zmmword ptr [@ax+0x40]"); - TEST("\x62\xf1\xff\x48\x12\xc8", "vmovddup zmm1, zmm0"); - - // Check EVEX.L'L constraints - TEST("\x62\xf2\x7d\x08\x18\x48\x01", "vbroadcastss xmm1, dword ptr [@ax+0x4]"); - TEST("\x62\xf2\x7d\x08\x18\xc8", "vbroadcastss xmm1, xmm0"); - TEST("\x62\xf2\x7d\x28\x18\x48\x01", "vbroadcastss ymm1, dword ptr [@ax+0x4]"); - TEST("\x62\xf2\x7d\x28\x18\xc8", "vbroadcastss ymm1, xmm0"); - TEST("\x62\xf2\x7d\x48\x18\x48\x01", "vbroadcastss zmm1, dword ptr [@ax+0x4]"); - TEST("\x62\xf2\x7d\x48\x18\xc8", "vbroadcastss zmm1, xmm0"); - TEST("\x62\xf2\x7d\x68\x18\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x68\x18\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x08\x19\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\x7d\x08\x19\xc8", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\x7d\x28\x19\x48\x01", "vbroadcastf32x2 ymm1, qword ptr [@ax+0x8]"); - TEST("\x62\xf2\x7d\x28\x19\xc8", "vbroadcastf32x2 ymm1, xmm0"); - TEST("\x62\xf2\x7d\x48\x19\x48\x01", "vbroadcastf32x2 zmm1, qword ptr [@ax+0x8]"); - TEST("\x62\xf2\x7d\x48\x19\xc8", "vbroadcastf32x2 zmm1, xmm0"); - TEST("\x62\xf2\x7d\x68\x19\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x68\x19\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x08\x19\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\xfd\x08\x19\xc8", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\xfd\x28\x19\x48\x01", "vbroadcastsd ymm1, qword ptr [@ax+0x8]"); - TEST("\x62\xf2\xfd\x28\x19\xc8", "vbroadcastsd ymm1, xmm0"); - TEST("\x62\xf2\xfd\x48\x19\x48\x01", "vbroadcastsd zmm1, qword ptr [@ax+0x8]"); - TEST("\x62\xf2\xfd\x48\x19\xc8", "vbroadcastsd zmm1, xmm0"); - TEST("\x62\xf2\xfd\x68\x19\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x68\x19\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x08\x1a\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\x7d\x08\x1a\xc8", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\x7d\x28\x1a\x48\x01", "vbroadcastf32x4 ymm1, xmmword ptr [@ax+0x10]"); - TEST("\x62\xf2\x7d\x28\x1a\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\x7d\x48\x1a\x48\x01", "vbroadcastf32x4 zmm1, xmmword ptr [@ax+0x10]"); - TEST("\x62\xf2\x7d\x48\x1a\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\x7d\x68\x1a\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x68\x1a\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x08\x1a\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\xfd\x08\x1a\xc8", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\xfd\x28\x1a\x48\x01", "vbroadcastf64x2 ymm1, xmmword ptr [@ax+0x10]"); - TEST("\x62\xf2\xfd\x28\x1a\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\xfd\x48\x1a\x48\x01", "vbroadcastf64x2 zmm1, xmmword ptr [@ax+0x10]"); - TEST("\x62\xf2\xfd\x48\x1a\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\xfd\x68\x1a\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x68\x1a\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x08\x1b\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\x7d\x08\x1b\xc8", "UD"); // EVEX.L'L = 0 - TEST3264("\x62\xf2\x7d\x28\x1b\x48\x01", "UD", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf2\x7d\x28\x1b\xc8", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf2\x7d\x48\x1b\x48\x01", "vbroadcastf32x8 zmm1, ymmword ptr [@ax+0x20]"); - TEST("\x62\xf2\x7d\x48\x1b\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\x7d\x68\x1b\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x68\x1b\xc8", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x08\x1b\x48\x01", "UD"); // EVEX.L'L = 0 - TEST("\x62\xf2\xfd\x08\x1b\xc8", "UD"); // EVEX.L'L = 0 - TEST3264("\x62\xf2\xfd\x28\x1b\x48\x01", "UD", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf2\xfd\x28\x1b\xc8", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf2\xfd\x48\x1b\x48\x01", "vbroadcastf64x4 zmm1, ymmword ptr [@ax+0x20]"); - TEST("\x62\xf2\xfd\x48\x1b\xc8", "UD"); // must have a memory operand - TEST("\x62\xf2\xfd\x68\x1b\x48\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\xfd\x68\x1b\xc8", "UD"); // EVEX.L'L = 3 - - // EVEX PEXTR/PINSR/MOV_G2X/MOV_X2G/PBROADCAST ignore EVEX.W in 32-bit mode - // and have different mnemonics on due to this distinction. - TEST("\x62\xf3\x7d\x08\x14\x00\x01", "vpextrb byte ptr [@ax], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x14\x40\x01\x01", "vpextrb byte ptr [@ax+0x1], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x14\xc0\x01", "vpextrb eax, xmm0, 0x1"); - TEST("\x62\xf3\x7d\x18\x14\xc0\x01", "UD"); // EVEX.b != 0 - TEST("\x62\xf3\x7d\x28\x14\xc0\x01", "UD"); // EVEX.L'L != 0 - TEST("\x62\xf3\x7d\x48\x14\xc0\x01", "UD"); // EVEX.L'L != 0 - TEST("\x62\xf3\x7d\x88\x14\xc0\x01", "UD"); // EVEX.z != 0 - TEST("\x62\xf3\x7d\x09\x14\xc0\x01", "UD"); // EVEX.aaa != 0 - TEST("\x62\xf3\x7d\x08\x15\x00\x01", "vpextrw word ptr [@ax], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x15\x40\x01\x01", "vpextrw word ptr [@ax+0x2], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x15\xc0\x01", "vpextrw eax, xmm0, 0x1"); - TEST("\x62\xf1\x7d\x08\xc5\xc0\x01", "vpextrw eax, xmm0, 0x1"); - TEST("\x62\xf1\x7d\x08\xc5\x00\x01", "UD"); // must have register operand - TEST("\x62\xf3\x7d\x08\x16\x00\x01", "vpextrd dword ptr [@ax], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x16\x40\x01\x01", "vpextrd dword ptr [@ax+0x4], xmm0, 0x1"); - TEST("\x62\xf3\x7d\x08\x16\xc0\x01", "vpextrd eax, xmm0, 0x1"); - TEST3264("\x62\xf3\xfd\x08\x16\x00\x01", "vpextrd dword ptr [eax], xmm0, 0x1", "vpextrq qword ptr [rax], xmm0, 0x1"); // EVEX.W ignored - TEST3264("\x62\xf3\xfd\x08\x16\x40\x01\x01", "vpextrd dword ptr [eax+0x4], xmm0, 0x1", "vpextrq qword ptr [rax+0x8], xmm0, 0x1"); // EVEX.W ignored - TEST3264("\x62\xf3\xfd\x08\x16\xc0\x01", "vpextrd eax, xmm0, 0x1", "vpextrq rax, xmm0, 0x1"); // EVEX.W ignored - TEST("\x62\xf3\x75\x08\x20\x00\x01", "vpinsrb xmm0, xmm1, byte ptr [@ax], 0x1"); - TEST("\x62\xf3\x75\x08\x20\x40\x01\x01", "vpinsrb xmm0, xmm1, byte ptr [@ax+0x1], 0x1"); - TEST("\x62\xf3\x75\x08\x20\xc0\x01", "vpinsrb xmm0, xmm1, al, 0x1"); - TEST("\x62\xf1\x75\x08\xc4\x00\x01", "vpinsrw xmm0, xmm1, word ptr [@ax], 0x1"); - TEST("\x62\xf1\x75\x08\xc4\x40\x01\x01", "vpinsrw xmm0, xmm1, word ptr [@ax+0x2], 0x1"); - TEST("\x62\xf1\x75\x08\xc4\xc0\x01", "vpinsrw xmm0, xmm1, ax, 0x1"); - TEST("\x62\xf3\x75\x08\x22\x00\x01", "vpinsrd xmm0, xmm1, dword ptr [@ax], 0x1"); - TEST("\x62\xf3\x75\x08\x22\x40\x01\x01", "vpinsrd xmm0, xmm1, dword ptr [@ax+0x4], 0x1"); - TEST("\x62\xf3\x75\x08\x22\xc0\x01", "vpinsrd xmm0, xmm1, eax, 0x1"); - TEST3264("\x62\xf3\xf5\x08\x22\x00\x01", "vpinsrd xmm0, xmm1, dword ptr [eax], 0x1", "vpinsrq xmm0, xmm1, qword ptr [rax], 0x1"); // EVEX.W ignored - TEST3264("\x62\xf3\xf5\x08\x22\x40\x01\x01", "vpinsrd xmm0, xmm1, dword ptr [eax+0x4], 0x1", "vpinsrq xmm0, xmm1, qword ptr [rax+0x8], 0x1"); // EVEX.W ignored - TEST3264("\x62\xf3\xf5\x08\x22\xc0\x01", "vpinsrd xmm0, xmm1, eax, 0x1", "vpinsrq xmm0, xmm1, rax, 0x1"); // EVEX.W ignored - TEST("\x62\xf1\x7d\x08\x6e\x40\x01", "vmovd xmm0, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x7d\x28\x6e\x40\x01", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\x7d\x48\x6e\x40\x01", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\x7d\x68\x6e\x40\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf1\x7d\x08\x6e\xc1", "vmovd xmm0, ecx"); - TEST("\x62\xf1\x7d\x28\x6e\xc1", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\x7d\x48\x6e\xc1", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\x7d\x68\x6e\xc1", "UD"); // EVEX.L'L = 3 - TEST3264("\x62\xf1\xfd\x08\x6e\x40\x01", "vmovd xmm0, dword ptr [eax+0x4]", "vmovq xmm0, qword ptr [rax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xfd\x28\x6e\x40\x01", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\xfd\x48\x6e\x40\x01", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\xfd\x68\x6e\x40\x01", "UD"); // EVEX.L'L = 3 - TEST3264("\x62\xf1\xfd\x08\x6e\xc1", "vmovd xmm0, ecx", "vmovq xmm0, rcx"); // EVEX.W ignored - TEST("\x62\xf1\xfd\x28\x6e\xc1", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\xfd\x48\x6e\xc1", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\xfd\x68\x6e\xc1", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf1\x7d\x08\x7e\x40\x01", "vmovd dword ptr [@ax+0x4], xmm0"); - TEST("\x62\xf1\x7d\x28\x7e\x40\x01", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\x7d\x48\x7e\x40\x01", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\x7d\x68\x7e\x40\x01", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf1\x7d\x08\x7e\xc1", "vmovd ecx, xmm0"); - TEST("\x62\xf1\x7d\x28\x7e\xc1", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\x7d\x48\x7e\xc1", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\x7d\x68\x7e\xc1", "UD"); // EVEX.L'L = 3 - TEST3264("\x62\xf1\xfd\x08\x7e\x40\x01", "vmovd dword ptr [eax+0x4], xmm0", "vmovq qword ptr [rax+0x8], xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfd\x28\x7e\x40\x01", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\xfd\x48\x7e\x40\x01", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\xfd\x68\x7e\x40\x01", "UD"); // EVEX.L'L = 3 - TEST3264("\x62\xf1\xfd\x08\x7e\xc1", "vmovd ecx, xmm0", "vmovq rcx, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfd\x28\x7e\xc1", "UD"); // EVEX.L'L = 1 - TEST("\x62\xf1\xfd\x48\x7e\xc1", "UD"); // EVEX.L'L = 2 - TEST("\x62\xf1\xfd\x68\x7e\xc1", "UD"); // EVEX.L'L = 3 - TEST("\x62\xf2\x7d\x08\x7a\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7d\x08\x7a\xc0", "vpbroadcastb xmm0, al"); - TEST("\x62\xf2\x7d\x28\x7a\xc0", "vpbroadcastb ymm0, al"); - TEST("\x62\xf2\x7d\x48\x7a\xc0", "vpbroadcastb zmm0, al"); - TEST("\x62\xf2\xfd\x08\x7a\xc0", "UD"); // EVEX.W = 1 - TEST("\x62\xf2\x7d\x18\x7a\xc0", "UD"); // EVEX.b = 1 - TEST("\x62\xf2\x7d\x09\x7a\xc0", "vpbroadcastb xmm0{k1}, al"); - TEST("\x62\xf2\x7d\x89\x7a\xc0", "vpbroadcastb xmm0{k1}{z}, al"); - TEST("\x62\xf2\x7d\x08\x7b\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7d\x08\x7b\xc0", "vpbroadcastw xmm0, ax"); - TEST("\x62\xf2\x7d\x28\x7b\xc0", "vpbroadcastw ymm0, ax"); - TEST("\x62\xf2\x7d\x48\x7b\xc0", "vpbroadcastw zmm0, ax"); - TEST("\x62\xf2\xfd\x08\x7b\xc0", "UD"); // EVEX.W = 1 - TEST("\x62\xf2\x7d\x18\x7b\xc0", "UD"); // EVEX.b = 1 - TEST("\x62\xf2\x7d\x09\x7b\xc0", "vpbroadcastw xmm0{k1}, ax"); - TEST("\x62\xf2\x7d\x89\x7b\xc0", "vpbroadcastw xmm0{k1}{z}, ax"); - TEST("\x62\xf2\x7d\x08\x7c\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7d\x08\x7c\xc0", "vpbroadcastd xmm0, eax"); - TEST("\x62\xf2\x7d\x28\x7c\xc0", "vpbroadcastd ymm0, eax"); - TEST("\x62\xf2\x7d\x48\x7c\xc0", "vpbroadcastd zmm0, eax"); - TEST("\x62\xf2\x7d\x18\x7c\xc0", "UD"); // EVEX.b = 1 - TEST("\x62\xf2\x7d\x09\x7c\xc0", "vpbroadcastd xmm0{k1}, eax"); - TEST("\x62\xf2\x7d\x89\x7c\xc0", "vpbroadcastd xmm0{k1}{z}, eax"); - TEST("\x62\xf2\xfd\x08\x7c\x00", "UD"); // Must have register operand - TEST3264("\x62\xf2\xfd\x08\x7c\xc0", "vpbroadcastd xmm0, eax", "vpbroadcastq xmm0, rax"); // EVEX.W ignored - TEST3264("\x62\xf2\xfd\x28\x7c\xc0", "vpbroadcastd ymm0, eax", "vpbroadcastq ymm0, rax"); // EVEX.W ignored - TEST3264("\x62\xf2\xfd\x48\x7c\xc0", "vpbroadcastd zmm0, eax", "vpbroadcastq zmm0, rax"); // EVEX.W ignored - TEST("\x62\xf2\xfd\x18\x7c\xc0", "UD"); // EVEX.b = 1 - TEST3264("\x62\xf2\xfd\x09\x7c\xc0", "vpbroadcastd xmm0{k1}, eax", "vpbroadcastq xmm0{k1}, rax"); // EVEX.W ignored - TEST3264("\x62\xf2\xfd\x89\x7c\xc0", "vpbroadcastd xmm0{k1}{z}, eax", "vpbroadcastq xmm0{k1}{z}, rax"); // EVEX.W ignored - - // EVEX.z with memory or mask destination is UD - TEST32("\x62\xf2\x7d\x08\x63\x40\x01", "vpcompressb byte ptr [eax+0x1], xmm0"); - TEST32("\x67\x62\xf2\x7d\x08\x63\x40\x01", "vpcompressb byte ptr [bx+1*si+0x1], xmm0"); - TEST64("\x62\xf2\x7d\x08\x63\x40\x01", "vpcompressb byte ptr [rax+0x1], xmm0"); - TEST64("\x67\x62\xf2\x7d\x08\x63\x40\x01", "vpcompressb byte ptr [eax+0x1], xmm0"); - TEST32("\x62\xf2\x7d\x88\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf2\x7d\x88\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf2\x7d\x88\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf2\x7d\x88\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x62\xf2\x7d\x09\x63\x40\x01", "vpcompressb byte ptr [eax+0x1]{k1}, xmm0"); - TEST32("\x67\x62\xf2\x7d\x09\x63\x40\x01", "vpcompressb byte ptr [bx+1*si+0x1]{k1}, xmm0"); - TEST64("\x62\xf2\x7d\x09\x63\x40\x01", "vpcompressb byte ptr [rax+0x1]{k1}, xmm0"); - TEST64("\x67\x62\xf2\x7d\x09\x63\x40\x01", "vpcompressb byte ptr [eax+0x1]{k1}, xmm0"); - TEST32("\x62\xf2\x7d\x89\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST32("\x67\x62\xf2\x7d\x89\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x62\xf2\x7d\x89\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST64("\x67\x62\xf2\x7d\x89\x63\x40\x01", "UD"); // EVEX.z = 1 - TEST("\x62\xf2\x7d\x08\x63\xc1", "vpcompressb xmm1, xmm0"); - TEST("\x62\xf2\x7d\x09\x63\xc1", "vpcompressb xmm1{k1}, xmm0"); - TEST("\x62\xf2\x7d\x88\x63\xc1", "UD"); // EVEX.z = 1 - TEST("\x62\xf2\x7d\x89\x63\xc1", "vpcompressb xmm1{k1}{z}, xmm0"); - TEST("\x62\xf1\x75\x08\x74\xc2", "vpcmpeqb k0, xmm1, xmm2"); - TEST("\x62\xf1\x75\x09\x74\xc2", "vpcmpeqb k0{k1}, xmm1, xmm2"); - TEST("\x62\xf1\x75\x88\x74\xc2", "UD"); // EVEX.z = 1 - TEST("\x62\xf1\x75\x89\x74\xc2", "UD"); // EVEX.z = 1 - - // CVT(T?S[SD]2U?SI|U?SI2S[SD]) ignore EVEX.W in 32-bit mode. - TEST("\x62\xf1\x7e\x08\x2c\x40\x01", "vcvttss2si eax, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x7e\x18\x2c\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7e\x08\x2c\xc0", "vcvttss2si eax, xmm0"); - TEST("\x62\xf1\x7e\x18\x2c\xc0", "vcvttss2si eax, xmm0, {sae}"); - TEST("\x62\xf1\xfe\x08\x2c\x40\x01", "vcvttss2si @ax, dword ptr [@ax+0x4]"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x08\x2c\xc0", "vcvttss2si @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x18\x2c\xc0", "vcvttss2si @ax, xmm0, {sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7f\x08\x2c\x40\x01", "vcvttsd2si eax, qword ptr [@ax+0x8]"); - TEST("\x62\xf1\x7f\x18\x2c\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7f\x08\x2c\xc0", "vcvttsd2si eax, xmm0"); - TEST("\x62\xf1\x7f\x18\x2c\xc0", "vcvttsd2si eax, xmm0, {sae}"); - TEST("\x62\xf1\xff\x08\x2c\x40\x01", "vcvttsd2si @ax, qword ptr [@ax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xff\x08\x2c\xc0", "vcvttsd2si @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xff\x18\x2c\xc0", "vcvttsd2si @ax, xmm0, {sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7e\x08\x2d\x40\x01", "vcvtss2si eax, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x7e\x18\x2d\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7e\x08\x2d\xc0", "vcvtss2si eax, xmm0"); - TEST("\x62\xf1\x7e\x18\x2d\xc0", "vcvtss2si eax, xmm0, {rn-sae}"); - TEST("\x62\xf1\xfe\x08\x2d\x40\x01", "vcvtss2si @ax, dword ptr [@ax+0x4]"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x08\x2d\xc0", "vcvtss2si @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x18\x2d\xc0", "vcvtss2si @ax, xmm0, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7f\x08\x2d\x40\x01", "vcvtsd2si eax, qword ptr [@ax+0x8]"); - TEST("\x62\xf1\x7f\x18\x2d\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7f\x08\x2d\xc0", "vcvtsd2si eax, xmm0"); - TEST("\x62\xf1\x7f\x18\x2d\xc0", "vcvtsd2si eax, xmm0, {rn-sae}"); - TEST("\x62\xf1\xff\x08\x2d\x40\x01", "vcvtsd2si @ax, qword ptr [@ax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xff\x08\x2d\xc0", "vcvtsd2si @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xff\x18\x2d\xc0", "vcvtsd2si @ax, xmm0, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7e\x08\x78\x40\x01", "vcvttss2usi eax, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x7e\x18\x78\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7e\x08\x78\xc0", "vcvttss2usi eax, xmm0"); - TEST("\x62\xf1\x7e\x18\x78\xc0", "vcvttss2usi eax, xmm0, {sae}"); - TEST("\x62\xf1\xfe\x08\x78\x40\x01", "vcvttss2usi @ax, dword ptr [@ax+0x4]"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x08\x78\xc0", "vcvttss2usi @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x18\x78\xc0", "vcvttss2usi @ax, xmm0, {sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7f\x08\x78\x40\x01", "vcvttsd2usi eax, qword ptr [@ax+0x8]"); - TEST("\x62\xf1\x7f\x18\x78\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7f\x08\x78\xc0", "vcvttsd2usi eax, xmm0"); - TEST("\x62\xf1\x7f\x18\x78\xc0", "vcvttsd2usi eax, xmm0, {sae}"); - TEST("\x62\xf1\xff\x08\x78\x40\x01", "vcvttsd2usi @ax, qword ptr [@ax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xff\x08\x78\xc0", "vcvttsd2usi @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xff\x18\x78\xc0", "vcvttsd2usi @ax, xmm0, {sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7e\x08\x79\x40\x01", "vcvtss2usi eax, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x7e\x18\x79\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7e\x08\x79\xc0", "vcvtss2usi eax, xmm0"); - TEST("\x62\xf1\x7e\x18\x79\xc0", "vcvtss2usi eax, xmm0, {rn-sae}"); - TEST("\x62\xf1\xfe\x08\x79\x40\x01", "vcvtss2usi @ax, dword ptr [@ax+0x4]"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x08\x79\xc0", "vcvtss2usi @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xfe\x18\x79\xc0", "vcvtss2usi @ax, xmm0, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x7f\x08\x79\x40\x01", "vcvtsd2usi eax, qword ptr [@ax+0x8]"); - TEST("\x62\xf1\x7f\x18\x79\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x7f\x08\x79\xc0", "vcvtsd2usi eax, xmm0"); - TEST("\x62\xf1\x7f\x18\x79\xc0", "vcvtsd2usi eax, xmm0, {rn-sae}"); - TEST("\x62\xf1\xff\x08\x79\x40\x01", "vcvtsd2usi @ax, qword ptr [@ax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xff\x08\x79\xc0", "vcvtsd2usi @ax, xmm0"); // EVEX.W ignored - TEST("\x62\xf1\xff\x18\x79\xc0", "vcvtsd2usi @ax, xmm0, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x6e\x08\x2a\x40\x01", "vcvtsi2ss xmm0, xmm2, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x6e\x18\x2a\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x6e\x08\x2a\xc0", "vcvtsi2ss xmm0, xmm2, eax"); - TEST("\x62\xf1\x6e\x18\x2a\xc0", "vcvtsi2ss xmm0, xmm2, eax, {rn-sae}"); - TEST3264("\x62\xf1\xee\x08\x2a\x40\x01", "vcvtsi2ss xmm0, xmm2, dword ptr [eax+0x4]", "vcvtsi2ss xmm0, xmm2, qword ptr [rax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xee\x08\x2a\xc0", "vcvtsi2ss xmm0, xmm2, @ax"); // EVEX.W ignored - TEST("\x62\xf1\xee\x18\x2a\xc0", "vcvtsi2ss xmm0, xmm2, @ax, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x6f\x08\x2a\x40\x01", "vcvtsi2sd xmm0, xmm2, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x6f\x18\x2a\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x6f\x08\x2a\xc0", "vcvtsi2sd xmm0, xmm2, eax"); - TEST("\x62\xf1\x6f\x18\x2a\xc0", "vcvtsi2sd xmm0, xmm2, eax, {rn-sae}"); - TEST3264("\x62\xf1\xef\x08\x2a\x40\x01", "vcvtsi2sd xmm0, xmm2, dword ptr [eax+0x4]", "vcvtsi2sd xmm0, xmm2, qword ptr [rax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xef\x08\x2a\xc0", "vcvtsi2sd xmm0, xmm2, @ax"); // EVEX.W ignored - TEST("\x62\xf1\xef\x18\x2a\xc0", "vcvtsi2sd xmm0, xmm2, @ax, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x6e\x08\x7b\x40\x01", "vcvtusi2ss xmm0, xmm2, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x6e\x18\x7b\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x6e\x08\x7b\xc0", "vcvtusi2ss xmm0, xmm2, eax"); - TEST("\x62\xf1\x6e\x18\x7b\xc0", "vcvtusi2ss xmm0, xmm2, eax, {rn-sae}"); - TEST3264("\x62\xf1\xee\x08\x7b\x40\x01", "vcvtusi2ss xmm0, xmm2, dword ptr [eax+0x4]", "vcvtusi2ss xmm0, xmm2, qword ptr [rax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xee\x08\x7b\xc0", "vcvtusi2ss xmm0, xmm2, @ax"); // EVEX.W ignored - TEST("\x62\xf1\xee\x18\x7b\xc0", "vcvtusi2ss xmm0, xmm2, @ax, {rn-sae}"); // EVEX.W ignored - TEST("\x62\xf1\x6f\x08\x7b\x40\x01", "vcvtusi2sd xmm0, xmm2, dword ptr [@ax+0x4]"); - TEST("\x62\xf1\x6f\x18\x7b\x40\x01", "UD"); // EVEX.b with memory operand - TEST("\x62\xf1\x6f\x08\x7b\xc0", "vcvtusi2sd xmm0, xmm2, eax"); - TEST("\x62\xf1\x6f\x18\x7b\xc0", "vcvtusi2sd xmm0, xmm2, eax, {rn-sae}"); - TEST3264("\x62\xf1\xef\x08\x7b\x40\x01", "vcvtusi2sd xmm0, xmm2, dword ptr [eax+0x4]", "vcvtusi2sd xmm0, xmm2, qword ptr [rax+0x8]"); // EVEX.W ignored - TEST("\x62\xf1\xef\x08\x7b\xc0", "vcvtusi2sd xmm0, xmm2, @ax"); // EVEX.W ignored - TEST("\x62\xf1\xef\x18\x7b\xc0", "vcvtusi2sd xmm0, xmm2, @ax, {rn-sae}"); // EVEX.W ignored - - // 32-bit mode: no UD constraints for K-reg - // 64-bit mode: EVEX.R/EVEX.vvvv=0xxx causes UD for K-reg; EVEX.B is ignored - TEST("\xc5\xed\x41\x00", "UD"); // Must have register operand - TEST("\xc5\xed\x41\xcb", "kandb k1, k2, k3"); - TEST("\xc4\xe1\x6d\x41\xcb", "kandb k1, k2, k3"); // 3-byte VEX encoding - TEST("\xc4\xc1\x6d\x41\xcb", "kandb k1, k2, k3"); // VEX.B is ignored - TEST64("\xc4\x61\x6d\x41\xcb", "UD"); // VEX.R is UD - TEST3264("\xc4\xe1\x2d\x41\xcb", "kandb k1, k2, k3", "UD"); // 32-bit: VEX.vvvv MSB is ignored, 64-bit: VEX.vvvv = 0xxx - TEST64("\xc5\xad\x41\xcb", "UD"); // VEX.vvvv = 0xxx - - TEST("\x62\xf2\x7e\x08\x28\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7e\x08\x28\xc1", "vpmovm2b xmm0, k1"); - TEST3264("\x62\xe2\x7e\x08\x28\xc1", "vpmovm2b xmm0, k1", "vpmovm2b xmm16, k1"); // EVEX.R' ignored - TEST("\x62\xd2\x7e\x08\x28\xc1", "vpmovm2b xmm0, k1"); // EVEX.B ignored - TEST64("\x62\xb2\x7e\x08\x28\xc1", "vpmovm2b xmm0, k1"); // EVEX.X ignored - TEST64("\x62\x72\x7e\x08\x28\xc1", "vpmovm2b xmm8, k1"); - TEST("\x62\xf2\xfe\x08\x28\x00", "UD"); // Must have register operand - TEST("\x62\xf2\xfe\x08\x28\xc1", "vpmovm2w xmm0, k1"); - TEST3264("\x62\xe2\xfe\x08\x28\xc1", "vpmovm2w xmm0, k1", "vpmovm2w xmm16, k1"); // EVEX.R' ignored - TEST("\x62\xd2\xfe\x08\x28\xc1", "vpmovm2w xmm0, k1"); // EVEX.B ignored - TEST64("\x62\xb2\xfe\x08\x28\xc1", "vpmovm2w xmm0, k1"); // EVEX.X ignored - TEST64("\x62\x72\xfe\x08\x28\xc1", "vpmovm2w xmm8, k1"); - TEST("\x62\xf2\x7e\x08\x38\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7e\x08\x38\xc1", "vpmovm2d xmm0, k1"); - TEST3264("\x62\xe2\x7e\x08\x38\xc1", "vpmovm2d xmm0, k1", "vpmovm2d xmm16, k1"); // EVEX.R' ignored - TEST("\x62\xd2\x7e\x08\x38\xc1", "vpmovm2d xmm0, k1"); // EVEX.B ignored - TEST64("\x62\xb2\x7e\x08\x38\xc1", "vpmovm2d xmm0, k1"); // EVEX.X ignored - TEST64("\x62\x72\x7e\x08\x38\xc1", "vpmovm2d xmm8, k1"); - TEST("\x62\xf2\xfe\x08\x38\x00", "UD"); // Must have register operand - TEST("\x62\xf2\xfe\x08\x38\xc1", "vpmovm2q xmm0, k1"); - TEST3264("\x62\xe2\xfe\x08\x38\xc1", "vpmovm2q xmm0, k1", "vpmovm2q xmm16, k1"); // EVEX.R' ignored - TEST("\x62\xd2\xfe\x08\x38\xc1", "vpmovm2q xmm0, k1"); // EVEX.B ignored - TEST64("\x62\xb2\xfe\x08\x38\xc1", "vpmovm2q xmm0, k1"); // EVEX.X ignored - TEST64("\x62\x72\xfe\x08\x38\xc1", "vpmovm2q xmm8, k1"); - - TEST("\x62\xf2\x7e\x08\x29\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7e\x08\x29\xc1", "vpmovb2m k0, xmm1"); - TEST3264("\x62\xe2\x7e\x08\x29\xc1", "vpmovb2m k0, xmm1", "UD"); // 32-bit: EVEX.R' ignored, 64-bit: EVEX.R' for mask is UD - TEST3264("\x62\xd2\x7e\x08\x29\xc1", "vpmovb2m k0, xmm1", "vpmovb2m k0, xmm9"); // EVEX.B ignored - TEST64("\x62\xb2\x7e\x08\x29\xc1", "vpmovb2m k0, xmm17"); - TEST64("\x62\x72\x7e\x08\x29\xc1", "UD"); // EVEX.R for mask is UD - TEST("\x62\xf2\xfe\x08\x29\x00", "UD"); // Must have register operand - TEST("\x62\xf2\xfe\x08\x29\xc1", "vpmovw2m k0, xmm1"); - TEST3264("\x62\xe2\xfe\x08\x29\xc1", "vpmovw2m k0, xmm1", "UD"); // 32-bit: EVEX.R' ignored, 64-bit: EVEX.R' for mask is UD - TEST3264("\x62\xd2\xfe\x08\x29\xc1", "vpmovw2m k0, xmm1", "vpmovw2m k0, xmm9"); // EVEX.B ignored - TEST64("\x62\xb2\xfe\x08\x29\xc1", "vpmovw2m k0, xmm17"); - TEST64("\x62\x72\xfe\x08\x29\xc1", "UD"); // EVEX.R for mask is UD - TEST("\x62\xf2\x7e\x08\x39\x00", "UD"); // Must have register operand - TEST("\x62\xf2\x7e\x08\x39\xc1", "vpmovd2m k0, xmm1"); - TEST3264("\x62\xe2\x7e\x08\x39\xc1", "vpmovd2m k0, xmm1", "UD"); // 32-bit: EVEX.R' ignored, 64-bit: EVEX.R' for mask is UD - TEST3264("\x62\xd2\x7e\x08\x39\xc1", "vpmovd2m k0, xmm1", "vpmovd2m k0, xmm9"); // EVEX.B ignored - TEST64("\x62\xb2\x7e\x08\x39\xc1", "vpmovd2m k0, xmm17"); - TEST64("\x62\x72\x7e\x08\x39\xc1", "UD"); // EVEX.R for mask is UD - TEST("\x62\xf2\xfe\x08\x39\x00", "UD"); // Must have register operand - TEST("\x62\xf2\xfe\x08\x39\xc1", "vpmovq2m k0, xmm1"); - TEST3264("\x62\xe2\xfe\x08\x39\xc1", "vpmovq2m k0, xmm1", "UD"); // 32-bit: EVEX.R' ignored, 64-bit: EVEX.R' for mask is UD - TEST3264("\x62\xd2\xfe\x08\x39\xc1", "vpmovq2m k0, xmm1", "vpmovq2m k0, xmm9"); // EVEX.B ignored - TEST64("\x62\xb2\xfe\x08\x39\xc1", "vpmovq2m k0, xmm17"); - TEST64("\x62\x72\xfe\x08\x39\xc1", "UD"); // EVEX.R for mask is UD - - // VSIB encoding, test all combinations of EVEX.RXBR'V' once - TEST("\x62\xf2\x7d\x0a\xa2\xcc", "UD"); // Must have memory operand - TEST("\x62\xf2\x7d\x0a\xa2\x01", "UD"); // Must have SIB byte - TEST("\x62\xf2\x7d\x08\xa2\x0c\xe7", "UD"); // EVEX.aaa = 000 - TEST3264("\x67\x62\xf2\x7d\x0a\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [edi+8*xmm4]{k2}, xmm1"); // VISB and 16-bit addrsize is UD - TEST("\x62\xf2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [@di+8*xmm4]{k2}, xmm1"); - TEST3264("\x62\xd2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdps dword ptr [r15+8*xmm4]{k2}, xmm1"); - TEST64("\x62\xb2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm12]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm12]{k2}, xmm1"); - TEST3264("\x62\xf2\x7d\x02\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x02\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x72\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x72\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm28]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm28]{k2}, xmm9"); - TEST3264("\x62\xe2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdps dword ptr [rdi+8*xmm4]{k2}, xmm17"); - TEST3264("\x62\xc2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdps dword ptr [r15+8*xmm4]{k2}, xmm17"); - TEST64("\x62\xa2\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm12]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm12]{k2}, xmm17"); - TEST3264("\x62\xe2\x7d\x02\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x02\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x62\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x0a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x62\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*xmm28]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x02\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*xmm28]{k2}, xmm25"); - TEST("\x62\xf2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [@di+8*ymm4]{k2}, ymm1"); - TEST3264("\x62\xd2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterdps dword ptr [r15+8*ymm4]{k2}, ymm1"); - TEST64("\x62\xb2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm12]{k2}, ymm1"); - TEST64("\x62\x92\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm12]{k2}, ymm1"); - TEST3264("\x62\xf2\x7d\x22\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*ymm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x22\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*ymm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm28]{k2}, ymm1"); - TEST64("\x62\x92\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm28]{k2}, ymm1"); - TEST64("\x62\x72\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm4]{k2}, ymm9"); - TEST64("\x62\x52\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm4]{k2}, ymm9"); - TEST64("\x62\x32\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm12]{k2}, ymm9"); - TEST64("\x62\x12\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm12]{k2}, ymm9"); - TEST64("\x62\x72\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm20]{k2}, ymm9"); - TEST64("\x62\x52\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm20]{k2}, ymm9"); - TEST64("\x62\x32\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm28]{k2}, ymm9"); - TEST64("\x62\x12\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm28]{k2}, ymm9"); - TEST3264("\x62\xe2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterdps dword ptr [rdi+8*ymm4]{k2}, ymm17"); - TEST3264("\x62\xc2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterdps dword ptr [r15+8*ymm4]{k2}, ymm17"); - TEST64("\x62\xa2\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm12]{k2}, ymm17"); - TEST64("\x62\x82\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm12]{k2}, ymm17"); - TEST3264("\x62\xe2\x7d\x22\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*ymm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x22\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*ymm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm28]{k2}, ymm17"); - TEST64("\x62\x82\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm28]{k2}, ymm17"); - TEST64("\x62\x62\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm4]{k2}, ymm25"); - TEST64("\x62\x42\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm4]{k2}, ymm25"); - TEST64("\x62\x22\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm12]{k2}, ymm25"); - TEST64("\x62\x02\x7d\x2a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm12]{k2}, ymm25"); - TEST64("\x62\x62\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm20]{k2}, ymm25"); - TEST64("\x62\x42\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm20]{k2}, ymm25"); - TEST64("\x62\x22\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*ymm28]{k2}, ymm25"); - TEST64("\x62\x02\x7d\x22\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*ymm28]{k2}, ymm25"); - TEST("\x62\xf2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [@di+8*zmm4]{k2}, zmm1"); - TEST3264("\x62\xd2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterdps dword ptr [r15+8*zmm4]{k2}, zmm1"); - TEST64("\x62\xb2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm12]{k2}, zmm1"); - TEST64("\x62\x92\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm12]{k2}, zmm1"); - TEST3264("\x62\xf2\x7d\x42\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*zmm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x42\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*zmm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm28]{k2}, zmm1"); - TEST64("\x62\x92\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm28]{k2}, zmm1"); - TEST64("\x62\x72\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm4]{k2}, zmm9"); - TEST64("\x62\x52\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm4]{k2}, zmm9"); - TEST64("\x62\x32\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm12]{k2}, zmm9"); - TEST64("\x62\x12\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm12]{k2}, zmm9"); - TEST64("\x62\x72\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm20]{k2}, zmm9"); - TEST64("\x62\x52\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm20]{k2}, zmm9"); - TEST64("\x62\x32\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm28]{k2}, zmm9"); - TEST64("\x62\x12\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm28]{k2}, zmm9"); - TEST3264("\x62\xe2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterdps dword ptr [rdi+8*zmm4]{k2}, zmm17"); - TEST3264("\x62\xc2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterdps dword ptr [r15+8*zmm4]{k2}, zmm17"); - TEST64("\x62\xa2\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm12]{k2}, zmm17"); - TEST64("\x62\x82\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm12]{k2}, zmm17"); - TEST3264("\x62\xe2\x7d\x42\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [rdi+8*zmm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x42\xa2\x0c\xe7", "UD", "vscatterdps dword ptr [r15+8*zmm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm28]{k2}, zmm17"); - TEST64("\x62\x82\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm28]{k2}, zmm17"); - TEST64("\x62\x62\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm4]{k2}, zmm25"); - TEST64("\x62\x42\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm4]{k2}, zmm25"); - TEST64("\x62\x22\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm12]{k2}, zmm25"); - TEST64("\x62\x02\x7d\x4a\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm12]{k2}, zmm25"); - TEST64("\x62\x62\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm20]{k2}, zmm25"); - TEST64("\x62\x42\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm20]{k2}, zmm25"); - TEST64("\x62\x22\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [rdi+8*zmm28]{k2}, zmm25"); - TEST64("\x62\x02\x7d\x42\xa2\x0c\xe7", "vscatterdps dword ptr [r15+8*zmm28]{k2}, zmm25"); - TEST("\x62\xf2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [@di+8*xmm4]{k2}, xmm1"); - TEST3264("\x62\xd2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqps dword ptr [r15+8*xmm4]{k2}, xmm1"); - TEST64("\x62\xb2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm12]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm12]{k2}, xmm1"); - TEST3264("\x62\xf2\x7d\x02\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x02\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x72\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x72\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm28]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm28]{k2}, xmm9"); - TEST3264("\x62\xe2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqps dword ptr [rdi+8*xmm4]{k2}, xmm17"); - TEST3264("\x62\xc2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqps dword ptr [r15+8*xmm4]{k2}, xmm17"); - TEST64("\x62\xa2\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm12]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm12]{k2}, xmm17"); - TEST3264("\x62\xe2\x7d\x02\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x02\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x62\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x0a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x62\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*xmm28]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x02\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*xmm28]{k2}, xmm25"); - TEST("\x62\xf2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [@di+8*ymm4]{k2}, xmm1"); - TEST3264("\x62\xd2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*ymm4]{k2}, xmm1", "vscatterqps dword ptr [r15+8*ymm4]{k2}, xmm1"); - TEST64("\x62\xb2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm12]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm12]{k2}, xmm1"); - TEST3264("\x62\xf2\x7d\x22\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*ymm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x22\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*ymm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm28]{k2}, xmm1"); - TEST64("\x62\x92\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm28]{k2}, xmm1"); - TEST64("\x62\x72\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm4]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm4]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm12]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm12]{k2}, xmm9"); - TEST64("\x62\x72\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm20]{k2}, xmm9"); - TEST64("\x62\x52\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm20]{k2}, xmm9"); - TEST64("\x62\x32\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm28]{k2}, xmm9"); - TEST64("\x62\x12\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm28]{k2}, xmm9"); - TEST3264("\x62\xe2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*ymm4]{k2}, xmm1", "vscatterqps dword ptr [rdi+8*ymm4]{k2}, xmm17"); - TEST3264("\x62\xc2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*ymm4]{k2}, xmm1", "vscatterqps dword ptr [r15+8*ymm4]{k2}, xmm17"); - TEST64("\x62\xa2\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm12]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm12]{k2}, xmm17"); - TEST3264("\x62\xe2\x7d\x22\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*ymm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x22\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*ymm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm28]{k2}, xmm17"); - TEST64("\x62\x82\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm28]{k2}, xmm17"); - TEST64("\x62\x62\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm4]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm4]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm12]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x2a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm12]{k2}, xmm25"); - TEST64("\x62\x62\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm20]{k2}, xmm25"); - TEST64("\x62\x42\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm20]{k2}, xmm25"); - TEST64("\x62\x22\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*ymm28]{k2}, xmm25"); - TEST64("\x62\x02\x7d\x22\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*ymm28]{k2}, xmm25"); - TEST("\x62\xf2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [@di+8*zmm4]{k2}, ymm1"); - TEST3264("\x62\xd2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*zmm4]{k2}, ymm1", "vscatterqps dword ptr [r15+8*zmm4]{k2}, ymm1"); - TEST64("\x62\xb2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm12]{k2}, ymm1"); - TEST64("\x62\x92\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm12]{k2}, ymm1"); - TEST3264("\x62\xf2\x7d\x42\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*zmm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\x7d\x42\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*zmm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm28]{k2}, ymm1"); - TEST64("\x62\x92\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm28]{k2}, ymm1"); - TEST64("\x62\x72\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm4]{k2}, ymm9"); - TEST64("\x62\x52\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm4]{k2}, ymm9"); - TEST64("\x62\x32\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm12]{k2}, ymm9"); - TEST64("\x62\x12\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm12]{k2}, ymm9"); - TEST64("\x62\x72\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm20]{k2}, ymm9"); - TEST64("\x62\x52\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm20]{k2}, ymm9"); - TEST64("\x62\x32\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm28]{k2}, ymm9"); - TEST64("\x62\x12\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm28]{k2}, ymm9"); - TEST3264("\x62\xe2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*zmm4]{k2}, ymm1", "vscatterqps dword ptr [rdi+8*zmm4]{k2}, ymm17"); - TEST3264("\x62\xc2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [edi+8*zmm4]{k2}, ymm1", "vscatterqps dword ptr [r15+8*zmm4]{k2}, ymm17"); - TEST64("\x62\xa2\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm12]{k2}, ymm17"); - TEST64("\x62\x82\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm12]{k2}, ymm17"); - TEST3264("\x62\xe2\x7d\x42\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [rdi+8*zmm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\x7d\x42\xa3\x0c\xe7", "UD", "vscatterqps dword ptr [r15+8*zmm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm28]{k2}, ymm17"); - TEST64("\x62\x82\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm28]{k2}, ymm17"); - TEST64("\x62\x62\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm4]{k2}, ymm25"); - TEST64("\x62\x42\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm4]{k2}, ymm25"); - TEST64("\x62\x22\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm12]{k2}, ymm25"); - TEST64("\x62\x02\x7d\x4a\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm12]{k2}, ymm25"); - TEST64("\x62\x62\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm20]{k2}, ymm25"); - TEST64("\x62\x42\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm20]{k2}, ymm25"); - TEST64("\x62\x22\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [rdi+8*zmm28]{k2}, ymm25"); - TEST64("\x62\x02\x7d\x42\xa3\x0c\xe7", "vscatterqps dword ptr [r15+8*zmm28]{k2}, ymm25"); - TEST("\x62\xf2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [@di+8*xmm4]{k2}, xmm1"); - TEST3264("\x62\xd2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, xmm1"); - TEST64("\x62\xb2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, xmm1"); - TEST64("\x62\x92\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, xmm1"); - TEST3264("\x62\xf2\xfd\x02\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x02\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x92\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x72\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x52\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x32\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x12\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x72\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x52\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x32\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, xmm9"); - TEST64("\x62\x12\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, xmm9"); - TEST3264("\x62\xe2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, xmm17"); - TEST3264("\x62\xc2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, xmm17"); - TEST64("\x62\xa2\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, xmm17"); - TEST64("\x62\x82\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, xmm17"); - TEST3264("\x62\xe2\xfd\x02\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x02\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x82\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x62\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x42\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x22\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x02\xfd\x0a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x62\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x42\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x22\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, xmm25"); - TEST64("\x62\x02\xfd\x02\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, xmm25"); - TEST("\x62\xf2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [@di+8*xmm4]{k2}, ymm1"); - TEST3264("\x62\xd2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, ymm1", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, ymm1"); - TEST64("\x62\xb2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, ymm1"); - TEST64("\x62\x92\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, ymm1"); - TEST3264("\x62\xf2\xfd\x22\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x22\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, ymm1"); - TEST64("\x62\x92\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, ymm1"); - TEST64("\x62\x72\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, ymm9"); - TEST64("\x62\x52\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, ymm9"); - TEST64("\x62\x32\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, ymm9"); - TEST64("\x62\x12\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, ymm9"); - TEST64("\x62\x72\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, ymm9"); - TEST64("\x62\x52\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, ymm9"); - TEST64("\x62\x32\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, ymm9"); - TEST64("\x62\x12\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, ymm9"); - TEST3264("\x62\xe2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, ymm1", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, ymm17"); - TEST3264("\x62\xc2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*xmm4]{k2}, ymm1", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, ymm17"); - TEST64("\x62\xa2\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, ymm17"); - TEST64("\x62\x82\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, ymm17"); - TEST3264("\x62\xe2\xfd\x22\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x22\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, ymm17"); - TEST64("\x62\x82\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, ymm17"); - TEST64("\x62\x62\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm4]{k2}, ymm25"); - TEST64("\x62\x42\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm4]{k2}, ymm25"); - TEST64("\x62\x22\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm12]{k2}, ymm25"); - TEST64("\x62\x02\xfd\x2a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm12]{k2}, ymm25"); - TEST64("\x62\x62\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm20]{k2}, ymm25"); - TEST64("\x62\x42\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm20]{k2}, ymm25"); - TEST64("\x62\x22\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*xmm28]{k2}, ymm25"); - TEST64("\x62\x02\xfd\x22\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*xmm28]{k2}, ymm25"); - TEST("\x62\xf2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [@di+8*ymm4]{k2}, zmm1"); - TEST3264("\x62\xd2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*ymm4]{k2}, zmm1", "vscatterdpd qword ptr [r15+8*ymm4]{k2}, zmm1"); - TEST64("\x62\xb2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm12]{k2}, zmm1"); - TEST64("\x62\x92\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm12]{k2}, zmm1"); - TEST3264("\x62\xf2\xfd\x42\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*ymm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x42\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*ymm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm28]{k2}, zmm1"); - TEST64("\x62\x92\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm28]{k2}, zmm1"); - TEST64("\x62\x72\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm4]{k2}, zmm9"); - TEST64("\x62\x52\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm4]{k2}, zmm9"); - TEST64("\x62\x32\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm12]{k2}, zmm9"); - TEST64("\x62\x12\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm12]{k2}, zmm9"); - TEST64("\x62\x72\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm20]{k2}, zmm9"); - TEST64("\x62\x52\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm20]{k2}, zmm9"); - TEST64("\x62\x32\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm28]{k2}, zmm9"); - TEST64("\x62\x12\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm28]{k2}, zmm9"); - TEST3264("\x62\xe2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*ymm4]{k2}, zmm1", "vscatterdpd qword ptr [rdi+8*ymm4]{k2}, zmm17"); - TEST3264("\x62\xc2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [edi+8*ymm4]{k2}, zmm1", "vscatterdpd qword ptr [r15+8*ymm4]{k2}, zmm17"); - TEST64("\x62\xa2\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm12]{k2}, zmm17"); - TEST64("\x62\x82\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm12]{k2}, zmm17"); - TEST3264("\x62\xe2\xfd\x42\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [rdi+8*ymm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x42\xa2\x0c\xe7", "UD", "vscatterdpd qword ptr [r15+8*ymm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm28]{k2}, zmm17"); - TEST64("\x62\x82\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm28]{k2}, zmm17"); - TEST64("\x62\x62\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm4]{k2}, zmm25"); - TEST64("\x62\x42\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm4]{k2}, zmm25"); - TEST64("\x62\x22\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm12]{k2}, zmm25"); - TEST64("\x62\x02\xfd\x4a\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm12]{k2}, zmm25"); - TEST64("\x62\x62\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm20]{k2}, zmm25"); - TEST64("\x62\x42\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm20]{k2}, zmm25"); - TEST64("\x62\x22\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [rdi+8*ymm28]{k2}, zmm25"); - TEST64("\x62\x02\xfd\x42\xa2\x0c\xe7", "vscatterdpd qword ptr [r15+8*ymm28]{k2}, zmm25"); - TEST("\x62\xf2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [@di+8*xmm4]{k2}, xmm1"); - TEST3264("\x62\xd2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqpd qword ptr [r15+8*xmm4]{k2}, xmm1"); - TEST64("\x62\xb2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm12]{k2}, xmm1"); - TEST64("\x62\x92\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm12]{k2}, xmm1"); - TEST3264("\x62\xf2\xfd\x02\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x02\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*xmm20]{k2}, xmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x92\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm28]{k2}, xmm1"); - TEST64("\x62\x72\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x52\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm4]{k2}, xmm9"); - TEST64("\x62\x32\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x12\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm12]{k2}, xmm9"); - TEST64("\x62\x72\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x52\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm20]{k2}, xmm9"); - TEST64("\x62\x32\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm28]{k2}, xmm9"); - TEST64("\x62\x12\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm28]{k2}, xmm9"); - TEST3264("\x62\xe2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqpd qword ptr [rdi+8*xmm4]{k2}, xmm17"); - TEST3264("\x62\xc2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*xmm4]{k2}, xmm1", "vscatterqpd qword ptr [r15+8*xmm4]{k2}, xmm17"); - TEST64("\x62\xa2\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm12]{k2}, xmm17"); - TEST64("\x62\x82\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm12]{k2}, xmm17"); - TEST3264("\x62\xe2\xfd\x02\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x02\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*xmm20]{k2}, xmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x82\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm28]{k2}, xmm17"); - TEST64("\x62\x62\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x42\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm4]{k2}, xmm25"); - TEST64("\x62\x22\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x02\xfd\x0a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm12]{k2}, xmm25"); - TEST64("\x62\x62\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x42\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm20]{k2}, xmm25"); - TEST64("\x62\x22\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*xmm28]{k2}, xmm25"); - TEST64("\x62\x02\xfd\x02\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*xmm28]{k2}, xmm25"); - TEST("\x62\xf2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [@di+8*ymm4]{k2}, ymm1"); - TEST3264("\x62\xd2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterqpd qword ptr [r15+8*ymm4]{k2}, ymm1"); - TEST64("\x62\xb2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm12]{k2}, ymm1"); - TEST64("\x62\x92\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm12]{k2}, ymm1"); - TEST3264("\x62\xf2\xfd\x22\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*ymm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x22\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*ymm20]{k2}, ymm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm28]{k2}, ymm1"); - TEST64("\x62\x92\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm28]{k2}, ymm1"); - TEST64("\x62\x72\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm4]{k2}, ymm9"); - TEST64("\x62\x52\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm4]{k2}, ymm9"); - TEST64("\x62\x32\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm12]{k2}, ymm9"); - TEST64("\x62\x12\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm12]{k2}, ymm9"); - TEST64("\x62\x72\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm20]{k2}, ymm9"); - TEST64("\x62\x52\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm20]{k2}, ymm9"); - TEST64("\x62\x32\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm28]{k2}, ymm9"); - TEST64("\x62\x12\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm28]{k2}, ymm9"); - TEST3264("\x62\xe2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterqpd qword ptr [rdi+8*ymm4]{k2}, ymm17"); - TEST3264("\x62\xc2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*ymm4]{k2}, ymm1", "vscatterqpd qword ptr [r15+8*ymm4]{k2}, ymm17"); - TEST64("\x62\xa2\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm12]{k2}, ymm17"); - TEST64("\x62\x82\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm12]{k2}, ymm17"); - TEST3264("\x62\xe2\xfd\x22\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*ymm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x22\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*ymm20]{k2}, ymm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm28]{k2}, ymm17"); - TEST64("\x62\x82\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm28]{k2}, ymm17"); - TEST64("\x62\x62\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm4]{k2}, ymm25"); - TEST64("\x62\x42\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm4]{k2}, ymm25"); - TEST64("\x62\x22\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm12]{k2}, ymm25"); - TEST64("\x62\x02\xfd\x2a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm12]{k2}, ymm25"); - TEST64("\x62\x62\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm20]{k2}, ymm25"); - TEST64("\x62\x42\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm20]{k2}, ymm25"); - TEST64("\x62\x22\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*ymm28]{k2}, ymm25"); - TEST64("\x62\x02\xfd\x22\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*ymm28]{k2}, ymm25"); - TEST("\x62\xf2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [@di+8*zmm4]{k2}, zmm1"); - TEST3264("\x62\xd2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterqpd qword ptr [r15+8*zmm4]{k2}, zmm1"); - TEST64("\x62\xb2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm12]{k2}, zmm1"); - TEST64("\x62\x92\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm12]{k2}, zmm1"); - TEST3264("\x62\xf2\xfd\x42\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*zmm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST3264("\x62\xd2\xfd\x42\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*zmm20]{k2}, zmm1"); // EVEX.V' == 0 - TEST64("\x62\xb2\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm28]{k2}, zmm1"); - TEST64("\x62\x92\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm28]{k2}, zmm1"); - TEST64("\x62\x72\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm4]{k2}, zmm9"); - TEST64("\x62\x52\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm4]{k2}, zmm9"); - TEST64("\x62\x32\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm12]{k2}, zmm9"); - TEST64("\x62\x12\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm12]{k2}, zmm9"); - TEST64("\x62\x72\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm20]{k2}, zmm9"); - TEST64("\x62\x52\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm20]{k2}, zmm9"); - TEST64("\x62\x32\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm28]{k2}, zmm9"); - TEST64("\x62\x12\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm28]{k2}, zmm9"); - TEST3264("\x62\xe2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterqpd qword ptr [rdi+8*zmm4]{k2}, zmm17"); - TEST3264("\x62\xc2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [edi+8*zmm4]{k2}, zmm1", "vscatterqpd qword ptr [r15+8*zmm4]{k2}, zmm17"); - TEST64("\x62\xa2\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm12]{k2}, zmm17"); - TEST64("\x62\x82\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm12]{k2}, zmm17"); - TEST3264("\x62\xe2\xfd\x42\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [rdi+8*zmm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST3264("\x62\xc2\xfd\x42\xa3\x0c\xe7", "UD", "vscatterqpd qword ptr [r15+8*zmm20]{k2}, zmm17"); // EVEX.V' == 0 - TEST64("\x62\xa2\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm28]{k2}, zmm17"); - TEST64("\x62\x82\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm28]{k2}, zmm17"); - TEST64("\x62\x62\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm4]{k2}, zmm25"); - TEST64("\x62\x42\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm4]{k2}, zmm25"); - TEST64("\x62\x22\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm12]{k2}, zmm25"); - TEST64("\x62\x02\xfd\x4a\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm12]{k2}, zmm25"); - TEST64("\x62\x62\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm20]{k2}, zmm25"); - TEST64("\x62\x42\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm20]{k2}, zmm25"); - TEST64("\x62\x22\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [rdi+8*zmm28]{k2}, zmm25"); - TEST64("\x62\x02\xfd\x42\xa3\x0c\xe7", "vscatterqpd qword ptr [r15+8*zmm28]{k2}, zmm25"); - - // All EVEX-VSIB instructions. VSCATTER* cases additionally test scaled offset. - TEST("\x62\xf2\x7d\x09\xa2\x44\xe7\x01", "vscatterdps dword ptr [@di+8*xmm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x29\xa2\x44\xe7\x01", "vscatterdps dword ptr [@di+8*ymm4+0x4]{k1}, ymm0"); - TEST("\x62\xf2\x7d\x49\xa2\x44\xe7\x01", "vscatterdps dword ptr [@di+8*zmm4+0x4]{k1}, zmm0"); - TEST("\x62\xf2\x7d\x09\xa3\x44\xe7\x01", "vscatterqps dword ptr [@di+8*xmm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x29\xa3\x44\xe7\x01", "vscatterqps dword ptr [@di+8*ymm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x49\xa3\x44\xe7\x01", "vscatterqps dword ptr [@di+8*zmm4+0x4]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x09\xa2\x44\xe7\x01", "vscatterdpd qword ptr [@di+8*xmm4+0x8]{k1}, xmm0"); - TEST("\x62\xf2\xfd\x29\xa2\x44\xe7\x01", "vscatterdpd qword ptr [@di+8*xmm4+0x8]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x49\xa2\x44\xe7\x01", "vscatterdpd qword ptr [@di+8*ymm4+0x8]{k1}, zmm0"); - TEST("\x62\xf2\xfd\x09\xa3\x44\xe7\x01", "vscatterqpd qword ptr [@di+8*xmm4+0x8]{k1}, xmm0"); - TEST("\x62\xf2\xfd\x29\xa3\x44\xe7\x01", "vscatterqpd qword ptr [@di+8*ymm4+0x8]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x49\xa3\x44\xe7\x01", "vscatterqpd qword ptr [@di+8*zmm4+0x8]{k1}, zmm0"); - TEST("\x62\xf2\x7d\x09\xa0\x44\xe7\x01", "vpscatterdd dword ptr [@di+8*xmm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x29\xa0\x44\xe7\x01", "vpscatterdd dword ptr [@di+8*ymm4+0x4]{k1}, ymm0"); - TEST("\x62\xf2\x7d\x49\xa0\x44\xe7\x01", "vpscatterdd dword ptr [@di+8*zmm4+0x4]{k1}, zmm0"); - TEST("\x62\xf2\x7d\x09\xa1\x44\xe7\x01", "vpscatterqd dword ptr [@di+8*xmm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x29\xa1\x44\xe7\x01", "vpscatterqd dword ptr [@di+8*ymm4+0x4]{k1}, xmm0"); - TEST("\x62\xf2\x7d\x49\xa1\x44\xe7\x01", "vpscatterqd dword ptr [@di+8*zmm4+0x4]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x09\xa0\x44\xe7\x01", "vpscatterdq qword ptr [@di+8*xmm4+0x8]{k1}, xmm0"); - TEST("\x62\xf2\xfd\x29\xa0\x44\xe7\x01", "vpscatterdq qword ptr [@di+8*xmm4+0x8]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x49\xa0\x44\xe7\x01", "vpscatterdq qword ptr [@di+8*ymm4+0x8]{k1}, zmm0"); - TEST("\x62\xf2\xfd\x09\xa1\x44\xe7\x01", "vpscatterqq qword ptr [@di+8*xmm4+0x8]{k1}, xmm0"); - TEST("\x62\xf2\xfd\x29\xa1\x44\xe7\x01", "vpscatterqq qword ptr [@di+8*ymm4+0x8]{k1}, ymm0"); - TEST("\x62\xf2\xfd\x49\xa1\x44\xe7\x01", "vpscatterqq qword ptr [@di+8*zmm4+0x8]{k1}, zmm0"); - TEST("\x62\xf2\x7d\x09\x90\x44\xe7\x01", "vpgatherdd xmm0{k1}, dword ptr [@di+8*xmm4+0x4]"); - TEST("\x62\xf2\x7d\x29\x90\x44\xe7\x01", "vpgatherdd ymm0{k1}, dword ptr [@di+8*ymm4+0x4]"); - TEST("\x62\xf2\x7d\x49\x90\x44\xe7\x01", "vpgatherdd zmm0{k1}, dword ptr [@di+8*zmm4+0x4]"); - TEST("\x62\xf2\x7d\x09\x91\x44\xe7\x01", "vpgatherqd xmm0{k1}, dword ptr [@di+8*xmm4+0x4]"); - TEST("\x62\xf2\x7d\x29\x91\x44\xe7\x01", "vpgatherqd xmm0{k1}, dword ptr [@di+8*ymm4+0x4]"); - TEST("\x62\xf2\x7d\x49\x91\x44\xe7\x01", "vpgatherqd ymm0{k1}, dword ptr [@di+8*zmm4+0x4]"); - TEST("\x62\xf2\xfd\x09\x90\x44\xe7\x01", "vpgatherdq xmm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x29\x90\x44\xe7\x01", "vpgatherdq ymm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x49\x90\x44\xe7\x01", "vpgatherdq zmm0{k1}, qword ptr [@di+8*ymm4+0x8]"); - TEST("\x62\xf2\xfd\x09\x91\x44\xe7\x01", "vpgatherqq xmm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x29\x91\x44\xe7\x01", "vpgatherqq ymm0{k1}, qword ptr [@di+8*ymm4+0x8]"); - TEST("\x62\xf2\xfd\x49\x91\x44\xe7\x01", "vpgatherqq zmm0{k1}, qword ptr [@di+8*zmm4+0x8]"); - TEST("\x62\xf2\x7d\x09\x92\x44\xe7\x01", "vgatherdps xmm0{k1}, dword ptr [@di+8*xmm4+0x4]"); - TEST("\x62\xf2\x7d\x29\x92\x44\xe7\x01", "vgatherdps ymm0{k1}, dword ptr [@di+8*ymm4+0x4]"); - TEST("\x62\xf2\x7d\x49\x92\x44\xe7\x01", "vgatherdps zmm0{k1}, dword ptr [@di+8*zmm4+0x4]"); - TEST("\x62\xf2\x7d\x09\x93\x44\xe7\x01", "vgatherqps xmm0{k1}, dword ptr [@di+8*xmm4+0x4]"); - TEST("\x62\xf2\x7d\x29\x93\x44\xe7\x01", "vgatherqps xmm0{k1}, dword ptr [@di+8*ymm4+0x4]"); - TEST("\x62\xf2\x7d\x49\x93\x44\xe7\x01", "vgatherqps ymm0{k1}, dword ptr [@di+8*zmm4+0x4]"); - TEST("\x62\xf2\xfd\x09\x92\x44\xe7\x01", "vgatherdpd xmm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x29\x92\x44\xe7\x01", "vgatherdpd ymm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x49\x92\x44\xe7\x01", "vgatherdpd zmm0{k1}, qword ptr [@di+8*ymm4+0x8]"); - TEST("\x62\xf2\xfd\x09\x93\x44\xe7\x01", "vgatherqpd xmm0{k1}, qword ptr [@di+8*xmm4+0x8]"); - TEST("\x62\xf2\xfd\x29\x93\x44\xe7\x01", "vgatherqpd ymm0{k1}, qword ptr [@di+8*ymm4+0x8]"); - TEST("\x62\xf2\xfd\x49\x93\x44\xe7\x01", "vgatherqpd zmm0{k1}, qword ptr [@di+8*zmm4+0x8]"); - - // AVX512-FP16 - TEST("\x62\xf5\x74\x08\x5c\xc2", "vsubph xmm0, xmm1, xmm2"); - TEST("\x62\xf5\x74\x28\x5c\xc2", "vsubph ymm0, ymm1, ymm2"); - TEST("\x62\xf5\x74\x48\x5c\xc2", "vsubph zmm0, zmm1, zmm2"); - TEST("\x62\xf5\x74\x08\x5c\x42\x01", "vsubph xmm0, xmm1, xmmword ptr [@dx+0x10]"); - TEST("\x62\xf5\x74\x28\x5c\x42\x01", "vsubph ymm0, ymm1, ymmword ptr [@dx+0x20]"); - TEST("\x62\xf5\x74\x48\x5c\x42\x01", "vsubph zmm0, zmm1, zmmword ptr [@dx+0x40]"); - TEST("\x62\xf5\x74\x18\x5c\x42\x01", "vsubph xmm0, xmm1, word ptr [@dx+0x2]{1to8}"); - TEST("\x62\xf5\x74\x38\x5c\x42\x01", "vsubph ymm0, ymm1, word ptr [@dx+0x2]{1to16}"); - TEST("\x62\xf5\x74\x58\x5c\x42\x01", "vsubph zmm0, zmm1, word ptr [@dx+0x2]{1to32}"); - TEST64("\x62\x93\x36\x34\xc2\xeb\x89", "vcmpsh k5{k4}, xmm25, xmm27, 0x89, {sae}"); - TEST("\x62\xf5\x66\x4c\x11\xd5", "vmovsh xmm5{k4}, xmm3, xmm2"); - TEST64("\x62\x25\x66\x4c\x11\xd5", "vmovsh xmm21{k4}, xmm3, xmm26"); - - // GFNI - TEST("\x66\x0f\x38\xcf\xc1", "gf2p8mulb xmm0, xmm1"); - TEST("\x66\x0f\x3a\xce\xc1\x01", "gf2p8affineqb xmm0, xmm1, 0x1"); - TEST("\x66\x0f\x3a\xcf\xc1\x01", "gf2p8affineinvqb xmm0, xmm1, 0x1"); - TEST("\xc4\xe2\x69\xcf\xc1", "vgf2p8mulb xmm0, xmm2, xmm1"); - TEST("\xc4\xe2\x6d\xcf\xc1", "vgf2p8mulb ymm0, ymm2, ymm1"); - TEST("\xc4\xe3\xe9\xce\xc1\x01", "vgf2p8affineqb xmm0, xmm2, xmm1, 0x1"); - TEST("\xc4\xe3\xed\xce\xc1\x01", "vgf2p8affineqb ymm0, ymm2, ymm1, 0x1"); - TEST("\xc4\xe3\xe9\xcf\xc1\x01", "vgf2p8affineinvqb xmm0, xmm2, xmm1, 0x1"); - TEST("\xc4\xe3\xed\xcf\xc1\x01", "vgf2p8affineinvqb ymm0, ymm2, ymm1, 0x1"); - TEST("\x62\xf3\xdd\x18\xcf\x49\x01\x07", "vgf2p8affineinvqb xmm1, xmm4, qword ptr [@cx+0x8]{1to2}, 0x7"); - TEST64("\x62\xf3\xdd\x10\xcf\x49\x01\x07", "vgf2p8affineinvqb xmm1, xmm20, qword ptr [rcx+0x8]{1to2}, 0x7"); - - // AMD RDPRU - TEST64("\x0f\x01\xfd", "rdpru"); - TEST64("\x66\x0f\x01\xfd", "rdpru"); // 66 prefix ignored - - // AMD SNP - TEST64("\xf3\x0f\x01\xfd", "rmpquery"); - TEST64("\xf2\x0f\x01\xfd", "rmpread"); - TEST64("\xf3\x0f\x01\xfe", "rmpadjust"); - TEST64("\xf2\x0f\x01\xfe", "rmpupdate"); - TEST64("\xf3\x0f\x01\xff", "psmash"); - TEST64("\xf2\x0f\x01\xff", "pvalidate"); - - // PBNDKB - TEST3264("\x0f\x01\xc7", "UD", "pbndkb"); - - // SM4 - TEST("\xc4\xe2\x6a\xda\x01", "vsm4key4 xmm0, xmm2, xmmword ptr [@cx]"); - TEST("\xc4\xe2\x6e\xda\x01", "vsm4key4 ymm0, ymm2, ymmword ptr [@cx]"); - TEST("\xc4\xe2\x6a\xda\xc1", "vsm4key4 xmm0, xmm2, xmm1"); - TEST("\xc4\xe2\x6e\xda\xc1", "vsm4key4 ymm0, ymm2, ymm1"); - TEST("\x62\xf2\x6e\x08\xda\x01", "vsm4key4 xmm0, xmm2, xmmword ptr [@cx]"); - TEST("\x62\xf2\x6e\x28\xda\x01", "vsm4key4 ymm0, ymm2, ymmword ptr [@cx]"); - TEST("\x62\xf2\x6e\x48\xda\x01", "vsm4key4 zmm0, zmm2, zmmword ptr [@cx]"); - TEST("\x62\xf2\x6e\x08\xda\xc1", "vsm4key4 xmm0, xmm2, xmm1"); - TEST("\x62\xf2\x6e\x28\xda\xc1", "vsm4key4 ymm0, ymm2, ymm1"); - TEST("\x62\xf2\x6e\x48\xda\xc1", "vsm4key4 zmm0, zmm2, zmm1"); - TEST("\xc4\xe2\x6b\xda\x01", "vsm4rnds4 xmm0, xmm2, xmmword ptr [@cx]"); - TEST("\xc4\xe2\x6f\xda\x01", "vsm4rnds4 ymm0, ymm2, ymmword ptr [@cx]"); - TEST("\xc4\xe2\x6b\xda\xc1", "vsm4rnds4 xmm0, xmm2, xmm1"); - TEST("\xc4\xe2\x6f\xda\xc1", "vsm4rnds4 ymm0, ymm2, ymm1"); - TEST("\x62\xf2\x6f\x08\xda\x01", "vsm4rnds4 xmm0, xmm2, xmmword ptr [@cx]"); - TEST("\x62\xf2\x6f\x28\xda\x01", "vsm4rnds4 ymm0, ymm2, ymmword ptr [@cx]"); - TEST("\x62\xf2\x6f\x48\xda\x01", "vsm4rnds4 zmm0, zmm2, zmmword ptr [@cx]"); - TEST("\x62\xf2\x6f\x08\xda\xc1", "vsm4rnds4 xmm0, xmm2, xmm1"); - TEST("\x62\xf2\x6f\x28\xda\xc1", "vsm4rnds4 ymm0, ymm2, ymm1"); - TEST("\x62\xf2\x6f\x48\xda\xc1", "vsm4rnds4 zmm0, zmm2, zmm1"); - - - puts(failed ? "Some tests FAILED" : "All tests PASSED"); - return failed ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/third_party/fadec/decode.c b/third_party/fadec/decode.c deleted file mode 100644 index fc493be..0000000 --- a/third_party/fadec/decode.c +++ /dev/null @@ -1,791 +0,0 @@ - -#include -#include -#include - -#include - - -#ifdef __GNUC__ -#define LIKELY(x) __builtin_expect((x), 1) -#define UNLIKELY(x) __builtin_expect((x), 0) -#define ASSUME(x) do { if (!(x)) __builtin_unreachable(); } while (0) -#else -#define LIKELY(x) (x) -#define UNLIKELY(x) (x) -#define ASSUME(x) ((void) 0) -#endif - -// Defines FD_TABLE_OFFSET_32 and FD_TABLE_OFFSET_64, if available -#define FD_DECODE_TABLE_DEFINES -#include -#undef FD_DECODE_TABLE_DEFINES - -enum DecodeMode { - DECODE_64 = 0, - DECODE_32 = 1, -}; - -typedef enum DecodeMode DecodeMode; - -#define ENTRY_NONE 0 -#define ENTRY_INSTR 1 -#define ENTRY_TABLE256 2 -#define ENTRY_TABLE16 3 -#define ENTRY_TABLE8E 4 -#define ENTRY_TABLE_PREFIX 5 -#define ENTRY_TABLE_VEX 6 -#define ENTRY_TABLE_ROOT 8 -#define ENTRY_MASK 7 - -static uint16_t -table_lookup(unsigned cur_idx, unsigned entry_idx) { - static _Alignas(16) const uint16_t _decode_table[] = { -#define FD_DECODE_TABLE_DATA -#include -#undef FD_DECODE_TABLE_DATA - }; - return _decode_table[cur_idx + entry_idx]; -} - -static unsigned -table_walk(unsigned table_entry, unsigned entry_idx) { - return table_lookup(table_entry & ~0x3, entry_idx); -} - -#define LOAD_LE_1(buf) ((uint64_t) *(const uint8_t*) (buf)) -#define LOAD_LE_2(buf) (LOAD_LE_1(buf) | LOAD_LE_1((const uint8_t*) (buf) + 1)<<8) -#define LOAD_LE_3(buf) (LOAD_LE_2(buf) | LOAD_LE_1((const uint8_t*) (buf) + 2)<<16) -#define LOAD_LE_4(buf) (LOAD_LE_2(buf) | LOAD_LE_2((const uint8_t*) (buf) + 2)<<16) -#define LOAD_LE_8(buf) (LOAD_LE_4(buf) | LOAD_LE_4((const uint8_t*) (buf) + 4)<<32) - -enum -{ - PREFIX_REXB = 0x01, - PREFIX_REXX = 0x02, - PREFIX_REXR = 0x04, - PREFIX_REXW = 0x08, - PREFIX_REX = 0x40, - PREFIX_REXRR = 0x10, - PREFIX_VEX = 0x20, -}; - -struct InstrDesc -{ - uint16_t type; - uint16_t operand_indices; - uint16_t operand_sizes; - uint16_t reg_types; -}; - -#define DESC_HAS_MODRM(desc) (((desc)->operand_indices & (3 << 0)) != 0) -#define DESC_MODRM_IDX(desc) ((((desc)->operand_indices >> 0) & 3) ^ 3) -#define DESC_HAS_MODREG(desc) (((desc)->operand_indices & (3 << 2)) != 0) -#define DESC_MODREG_IDX(desc) ((((desc)->operand_indices >> 2) & 3) ^ 3) -#define DESC_HAS_VEXREG(desc) (((desc)->operand_indices & (3 << 4)) != 0) -#define DESC_VEXREG_IDX(desc) ((((desc)->operand_indices >> 4) & 3) ^ 3) -#define DESC_IMM_CONTROL(desc) (((desc)->operand_indices >> 12) & 0x7) -#define DESC_IMM_IDX(desc) ((((desc)->operand_indices >> 6) & 3) ^ 3) -#define DESC_EVEX_BCST(desc) (((desc)->operand_indices >> 8) & 1) -#define DESC_EVEX_MASK(desc) (((desc)->operand_indices >> 9) & 1) -#define DESC_ZEROREG_VAL(desc) (((desc)->operand_indices >> 10) & 1) -#define DESC_LOCK(desc) (((desc)->operand_indices >> 11) & 1) -#define DESC_VSIB(desc) (((desc)->operand_indices >> 15) & 1) -#define DESC_OPSIZE(desc) (((desc)->reg_types >> 11) & 7) -#define DESC_MODRM_SIZE(desc) (((desc)->operand_sizes >> 0) & 3) -#define DESC_MODREG_SIZE(desc) (((desc)->operand_sizes >> 2) & 3) -#define DESC_VEXREG_SIZE(desc) (((desc)->operand_sizes >> 4) & 3) -#define DESC_IMM_SIZE(desc) (((desc)->operand_sizes >> 6) & 3) -#define DESC_LEGACY(desc) (((desc)->operand_sizes >> 8) & 1) -#define DESC_SIZE_FIX1(desc) (((desc)->operand_sizes >> 10) & 7) -#define DESC_SIZE_FIX2(desc) (((desc)->operand_sizes >> 13) & 3) -#define DESC_INSTR_WIDTH(desc) (((desc)->operand_sizes >> 15) & 1) -#define DESC_MODRM(desc) (((desc)->reg_types >> 14) & 1) -#define DESC_IGN66(desc) (((desc)->reg_types >> 15) & 1) -#define DESC_EVEX_SAE(desc) (((desc)->reg_types >> 8) & 1) -#define DESC_EVEX_ER(desc) (((desc)->reg_types >> 9) & 1) -#define DESC_EVEX_BCST16(desc) (((desc)->reg_types >> 10) & 1) -#define DESC_REGTY_MODRM(desc) (((desc)->reg_types >> 0) & 7) -#define DESC_REGTY_MODREG(desc) (((desc)->reg_types >> 3) & 7) -#define DESC_REGTY_VEXREG(desc) (((desc)->reg_types >> 6) & 3) - -int -fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address, - FdInstr* instr) -{ - int len = len_sz > 15 ? 15 : len_sz; - - // Ensure that we can actually handle the decode request - DecodeMode mode; - unsigned table_root_idx; - switch (mode_int) - { -#if defined(FD_TABLE_OFFSET_32) - case 32: table_root_idx = FD_TABLE_OFFSET_32; mode = DECODE_32; break; -#endif -#if defined(FD_TABLE_OFFSET_64) - case 64: table_root_idx = FD_TABLE_OFFSET_64; mode = DECODE_64; break; -#endif - default: return FD_ERR_INTERNAL; - } - - int off = 0; - uint8_t vex_operand = 0; - - uint8_t addr_size = mode == DECODE_64 ? 3 : 2; - unsigned prefix_rex = 0; - uint8_t prefix_rep = 0; - unsigned vexl = 0; - unsigned prefix_evex = 0; - instr->segment = FD_REG_NONE; - - // Values must match prefixes in parseinstrs.py. - enum { - PF_SEG1 = 0xfff8 - 0xfff8, - PF_SEG2 = 0xfff9 - 0xfff8, - PF_66 = 0xfffa - 0xfff8, - PF_67 = 0xfffb - 0xfff8, - PF_LOCK = 0xfffc - 0xfff8, - PF_REP = 0xfffd - 0xfff8, - PF_REX = 0xfffe - 0xfff8, - }; - - uint8_t prefixes[8] = {0}; - unsigned table_entry = 0; - while (true) { - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - uint8_t prefix = buffer[off]; - table_entry = table_lookup(table_root_idx, prefix); - if (LIKELY(table_entry - 0xfff8 >= 8)) - break; - prefixes[PF_REX] = 0; - prefixes[table_entry - 0xfff8] = prefix; - off++; - } - if (off) { - if (UNLIKELY(prefixes[PF_SEG2])) { - if (prefixes[PF_SEG2] & 0x02) - instr->segment = prefixes[PF_SEG2] >> 3 & 3; - else - instr->segment = prefixes[PF_SEG2] & 7; - } - if (UNLIKELY(prefixes[PF_67])) - addr_size--; - prefix_rex = prefixes[PF_REX]; - prefix_rep = prefixes[PF_REP]; - } - - // table_entry kinds: INSTR(0), T16(1), ESCAPE_A(2), ESCAPE_B(3) - if (LIKELY(!(table_entry & 2))) { - off++; - - // Then, walk through ModR/M-encoded opcode extensions. - if (table_entry & 1) { - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - unsigned isreg = buffer[off] >= 0xc0; - table_entry = table_walk(table_entry, ((buffer[off] >> 2) & 0xe) | isreg); - // table_entry kinds: INSTR(0), T8E(1) - if (table_entry & 1) - table_entry = table_walk(table_entry, buffer[off] & 7); - } - - // table_entry kinds: INSTR(0) - goto direct; - } - - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - - unsigned opcode_escape = 0; - uint8_t mandatory_prefix = 0; // without escape/VEX/EVEX, this is ignored. - if (buffer[off] == 0x0f) - { - if (UNLIKELY(off + 1 >= len)) - return FD_ERR_PARTIAL; - if (buffer[off + 1] == 0x38) - opcode_escape = 2; - else if (buffer[off + 1] == 0x3a) - opcode_escape = 3; - else - opcode_escape = 1; - off += opcode_escape >= 2 ? 2 : 1; - - // If there is no REP/REPNZ prefix offer 66h as mandatory prefix. If - // there is a REP prefix, then the 66h prefix is ignored here. - mandatory_prefix = prefix_rep ? prefix_rep ^ 0xf1 : !!prefixes[PF_66]; - } - else if (UNLIKELY((unsigned) buffer[off] - 0xc4 < 2 || buffer[off] == 0x62)) - { - unsigned vex_prefix = buffer[off]; - // VEX (C4/C5) or EVEX (62) - if (UNLIKELY(off + 1 >= len)) - return FD_ERR_PARTIAL; - if (UNLIKELY(mode == DECODE_32 && buffer[off + 1] < 0xc0)) { - off++; - table_entry = table_walk(table_entry, 0); - // table_entry kinds: INSTR(0) - goto direct; - } - - // VEX/EVEX + 66/F3/F2/REX will #UD. - // Note: REX is also here only respected if it immediately precedes the - // opcode, in this case the VEX/EVEX "prefix". - if (prefixes[PF_66] || prefixes[PF_REP] || prefix_rex) - return FD_ERR_UD; - - uint8_t byte = buffer[off + 1]; - if (vex_prefix == 0xc5) // 2-byte VEX - { - opcode_escape = 1; - prefix_rex = byte & 0x80 ? 0 : PREFIX_REXR; - } - else // 3-byte VEX or EVEX - { - // SDM Vol 2A 2-15 (Dec. 2016): Ignored in 32-bit mode - if (mode == DECODE_64) - prefix_rex = byte >> 5 ^ 0x7; - if (vex_prefix == 0x62) // EVEX - { - if (byte & 0x08) // Bit 3 of opcode_escape must be clear. - return FD_ERR_UD; - _Static_assert(PREFIX_REXRR == 0x10, "wrong REXRR value"); - if (mode == DECODE_64) - prefix_rex |= (byte & PREFIX_REXRR) ^ PREFIX_REXRR; - } - else // 3-byte VEX - { - if (byte & 0x18) // Bits 4:3 of opcode_escape must be clear. - return FD_ERR_UD; - } - - opcode_escape = (byte & 0x07); - if (UNLIKELY(opcode_escape == 0)) { - int prefix_len = vex_prefix == 0x62 ? 4 : 3; - // Pretend to decode the prefix plus one opcode byte. - return off + prefix_len > len ? FD_ERR_PARTIAL : FD_ERR_UD; - } - - // Load third byte of VEX prefix - if (UNLIKELY(off + 2 >= len)) - return FD_ERR_PARTIAL; - byte = buffer[off + 2]; - prefix_rex |= byte & 0x80 ? PREFIX_REXW : 0; - } - - mandatory_prefix = byte & 3; - vex_operand = ((byte & 0x78) >> 3) ^ 0xf; - prefix_rex |= PREFIX_VEX; - - if (vex_prefix == 0x62) // EVEX - { - if (!(byte & 0x04)) // Bit 10 must be 1. - return FD_ERR_UD; - if (UNLIKELY(off + 3 >= len)) - return FD_ERR_PARTIAL; - byte = buffer[off + 3]; - // prefix_evex is z:L'L/RC:b:V':aaa - vexl = (byte >> 5) & 3; - prefix_evex = byte | 0x100; // Ensure that prefix_evex is non-zero. - if (mode == DECODE_64) // V' causes UD in 32-bit mode - vex_operand |= byte & 0x08 ? 0 : 0x10; // V' - else if (!(byte & 0x08)) - return FD_ERR_UD; - off += 4; - } - else // VEX - { - vexl = byte & 0x04 ? 1 : 0; - off += 0xc7 - vex_prefix; // 3 for c4, 2 for c5 - } - } - - table_entry = table_walk(table_entry, opcode_escape); - // table_entry kinds: INSTR(0) [only for invalid], T256(2) - if (UNLIKELY(!table_entry)) - return FD_ERR_UD; - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - table_entry = table_walk(table_entry, buffer[off++]); - // table_entry kinds: INSTR(0), T16(1), TVEX(2), TPREFIX(3) - - // Handle mandatory prefixes (which behave like an opcode ext.). - if ((table_entry & 3) == 3) - table_entry = table_walk(table_entry, mandatory_prefix); - // table_entry kinds: INSTR(0), T16(1), TVEX(2) - - // Then, walk through ModR/M-encoded opcode extensions. - if (table_entry & 1) { - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - unsigned isreg = buffer[off] >= 0xc0; - table_entry = table_walk(table_entry, ((buffer[off] >> 2) & 0xe) | isreg); - // table_entry kinds: INSTR(0), T8E(1), TVEX(2) - if (table_entry & 1) - table_entry = table_walk(table_entry, buffer[off] & 7); - } - // table_entry kinds: INSTR(0), TVEX(2) - - // For VEX prefix, we have to distinguish between VEX.W and VEX.L which may - // be part of the opcode. - if (UNLIKELY(table_entry & 2)) - { - uint8_t index = 0; - index |= prefix_rex & PREFIX_REXW ? (1 << 0) : 0; - // When EVEX.L'L is the rounding mode, the instruction must not have - // L'L constraints. - index |= vexl << 1; - table_entry = table_walk(table_entry, index); - } - // table_entry kinds: INSTR(0) - -direct: - // table_entry kinds: INSTR(0) - if (UNLIKELY(!table_entry)) - return FD_ERR_UD; - - static _Alignas(16) const struct InstrDesc descs[] = { -#define FD_DECODE_TABLE_DESCS -#include -#undef FD_DECODE_TABLE_DESCS - }; - const struct InstrDesc* desc = &descs[table_entry >> 2]; - - instr->type = desc->type; - instr->addrsz = addr_size; - instr->flags = ((prefix_rep + 1) & 6) + (mode == DECODE_64 ? FD_FLAG_64 : 0); - instr->address = address; - - for (unsigned i = 0; i < sizeof(instr->operands) / sizeof(FdOp); i++) - instr->operands[i] = (FdOp) {0}; - - if (DESC_MODRM(desc) && UNLIKELY(off++ >= len)) - return FD_ERR_PARTIAL; - unsigned op_byte = buffer[off - 1] | (!DESC_MODRM(desc) ? 0xc0 : 0); - - if (UNLIKELY(prefix_evex)) { - // VSIB inst (gather/scatter) without mask register or w/EVEX.z is UD - if (DESC_VSIB(desc) && (!(prefix_evex & 0x07) || (prefix_evex & 0x80))) - return FD_ERR_UD; - // Inst doesn't support masking, so EVEX.z or EVEX.aaa is UD - if (!DESC_EVEX_MASK(desc) && (prefix_evex & 0x87)) - return FD_ERR_UD; - // EVEX.z without EVEX.aaa is UD. The Intel SDM is rather unprecise - // about this, but real hardware doesn't accept this. - if ((prefix_evex & 0x87) == 0x80) - return FD_ERR_UD; - - // Cases for SAE/RC (reg operands only): - // - ER supported -> all ok - // - SAE supported -> assume L'L is RC, but ignored (undocumented) - // - Neither supported -> b == 0 - if ((prefix_evex & 0x10) && (op_byte & 0xc0) == 0xc0) { // EVEX.b+reg - if (!DESC_EVEX_SAE(desc)) - return FD_ERR_UD; - vexl = 2; - if (DESC_EVEX_ER(desc)) - instr->evex = prefix_evex; - else - instr->evex = (prefix_evex & 0x87) | 0x60; // set RC, clear B - } else { - if (UNLIKELY(vexl == 3)) // EVEX.L'L == 11b is UD - return FD_ERR_UD; - instr->evex = prefix_evex & 0x87; // clear RC, clear B - } - - if (DESC_VSIB(desc)) - vex_operand &= 0xf; // EVEX.V' is used as index extension instead. - } else { - instr->evex = 0; - } - - unsigned op_size; - unsigned op_size_alt = 0; - if (!(DESC_OPSIZE(desc) & 4)) { - if (mode == DECODE_64) - op_size = ((prefix_rex & PREFIX_REXW) || DESC_OPSIZE(desc) == 3) ? 4 : - UNLIKELY(prefixes[PF_66] && !DESC_IGN66(desc)) ? 2 : - DESC_OPSIZE(desc) ? 4 : - 3; - else - op_size = UNLIKELY(prefixes[PF_66] && !DESC_IGN66(desc)) ? 2 : 3; - } else { - op_size = 5 + vexl; - op_size_alt = op_size - (DESC_OPSIZE(desc) & 3); - } - - uint8_t operand_sizes[4] = { - DESC_SIZE_FIX1(desc), DESC_SIZE_FIX2(desc) + 1, op_size, op_size_alt - }; - - if (UNLIKELY(instr->type == FDI_MOV_CR || instr->type == FDI_MOV_DR)) { - unsigned modreg = (op_byte >> 3) & 0x7; - unsigned modrm = op_byte & 0x7; - - FdOp* op_modreg = &instr->operands[DESC_MODREG_IDX(desc)]; - op_modreg->type = FD_OT_REG; - op_modreg->size = op_size; - op_modreg->reg = modreg | (prefix_rex & PREFIX_REXR ? 8 : 0); - op_modreg->misc = instr->type == FDI_MOV_CR ? FD_RT_CR : FD_RT_DR; - if (instr->type == FDI_MOV_CR && (~0x011d >> op_modreg->reg) & 1) - return FD_ERR_UD; - else if (instr->type == FDI_MOV_DR && prefix_rex & PREFIX_REXR) - return FD_ERR_UD; - - FdOp* op_modrm = &instr->operands[DESC_MODRM_IDX(desc)]; - op_modrm->type = FD_OT_REG; - op_modrm->size = op_size; - op_modrm->reg = modrm | (prefix_rex & PREFIX_REXB ? 8 : 0); - op_modrm->misc = FD_RT_GPL; - goto skip_modrm; - } - - if (DESC_HAS_MODREG(desc)) - { - FdOp* op_modreg = &instr->operands[DESC_MODREG_IDX(desc)]; - unsigned reg_idx = (op_byte & 0x38) >> 3; - unsigned reg_ty = DESC_REGTY_MODREG(desc); - op_modreg->misc = reg_ty; - if (LIKELY(reg_ty < 2)) - reg_idx += prefix_rex & PREFIX_REXR ? 8 : 0; - else if (reg_ty == 7 && (prefix_rex & PREFIX_REXR || prefix_evex & 0x80)) - return FD_ERR_UD; // REXR in 64-bit mode or EVEX.z with mask as dest - if (UNLIKELY(reg_ty == FD_RT_VEC)) // REXRR ignored above in 32-bit mode - reg_idx += prefix_rex & PREFIX_REXRR ? 16 : 0; - else if (UNLIKELY(prefix_rex & PREFIX_REXRR)) - return FD_ERR_UD; - op_modreg->type = FD_OT_REG; - op_modreg->size = operand_sizes[DESC_MODREG_SIZE(desc)]; - op_modreg->reg = reg_idx; - } - - if (DESC_HAS_MODRM(desc)) - { - FdOp* op_modrm = &instr->operands[DESC_MODRM_IDX(desc)]; - op_modrm->size = operand_sizes[DESC_MODRM_SIZE(desc)]; - - unsigned rm = op_byte & 0x07; - if (op_byte >= 0xc0) - { - uint8_t reg_idx = rm; - unsigned reg_ty = DESC_REGTY_MODRM(desc); - op_modrm->misc = reg_ty; - if (LIKELY(reg_ty < 2)) - reg_idx += prefix_rex & PREFIX_REXB ? 8 : 0; - if (prefix_evex && reg_ty == 0) // vector registers only - reg_idx += prefix_rex & PREFIX_REXX ? 16 : 0; - op_modrm->type = FD_OT_REG; - op_modrm->reg = reg_idx; - } - else - { - unsigned dispscale = 0; - - if (UNLIKELY(prefix_evex)) { - // EVEX.z for memory destination operand is UD. - if (UNLIKELY(prefix_evex & 0x80) && DESC_MODRM_IDX(desc) == 0) - return FD_ERR_UD; - - // EVEX.b for memory-operand without broadcast support is UD. - if (UNLIKELY(prefix_evex & 0x10)) { - if (UNLIKELY(!DESC_EVEX_BCST(desc))) - return FD_ERR_UD; - if (UNLIKELY(DESC_EVEX_BCST16(desc))) - dispscale = 1; - else - dispscale = prefix_rex & PREFIX_REXW ? 3 : 2; - instr->segment |= dispscale << 6; // Store broadcast size - op_modrm->type = FD_OT_MEMBCST; - } else { - dispscale = op_modrm->size - 1; - op_modrm->type = FD_OT_MEM; - } - } else { - op_modrm->type = FD_OT_MEM; - } - - // 16-bit address size implies different ModRM encoding - if (UNLIKELY(addr_size == 1)) { - ASSUME(mode == DECODE_32); - if (UNLIKELY(DESC_VSIB(desc))) // 16-bit addr size + VSIB is UD - return FD_ERR_UD; - if (rm < 6) - op_modrm->misc = rm & 1 ? FD_REG_DI : FD_REG_SI; - else - op_modrm->misc = FD_REG_NONE; - - if (rm < 4) - op_modrm->reg = rm & 2 ? FD_REG_BP : FD_REG_BX; - else if (rm < 6 || (op_byte & 0xc7) == 0x06) - op_modrm->reg = FD_REG_NONE; - else - op_modrm->reg = rm == 6 ? FD_REG_BP : FD_REG_BX; - - const uint8_t* dispbase = &buffer[off]; - if (op_byte & 0x40) { - if (UNLIKELY((off += 1) > len)) - return FD_ERR_PARTIAL; - instr->disp = (int8_t) LOAD_LE_1(dispbase) * (1 << dispscale); - } else if (op_byte & 0x80 || (op_byte & 0xc7) == 0x06) { - if (UNLIKELY((off += 2) > len)) - return FD_ERR_PARTIAL; - instr->disp = (int16_t) LOAD_LE_2(dispbase); - } else { - instr->disp = 0; - } - goto end_modrm; - } - - // SIB byte - uint8_t base = rm; - if (rm == 4) { - if (UNLIKELY(off >= len)) - return FD_ERR_PARTIAL; - uint8_t sib = buffer[off++]; - unsigned scale = sib & 0xc0; - unsigned idx = (sib & 0x38) >> 3; - idx += prefix_rex & PREFIX_REXX ? 8 : 0; - base = sib & 0x07; - if (idx == 4) - idx = FD_REG_NONE; - op_modrm->misc = scale | idx; - } else { - op_modrm->misc = FD_REG_NONE; - } - - if (UNLIKELY(DESC_VSIB(desc))) { - // VSIB must have a memory operand with SIB byte. - if (rm != 4) - return FD_ERR_UD; - _Static_assert(FD_REG_NONE == 0x3f, "unexpected FD_REG_NONE"); - // idx 4 is valid for VSIB - if ((op_modrm->misc & 0x3f) == FD_REG_NONE) - op_modrm->misc &= 0xc4; - if (prefix_evex) // EVEX.V':EVEX.X:SIB.idx - op_modrm->misc |= prefix_evex & 0x8 ? 0 : 0x10; - } - - // RIP-relative addressing only if SIB-byte is absent - if (op_byte < 0x40 && rm == 5 && mode == DECODE_64) - op_modrm->reg = FD_REG_IP; - else if (op_byte < 0x40 && base == 5) - op_modrm->reg = FD_REG_NONE; - else - op_modrm->reg = base + (prefix_rex & PREFIX_REXB ? 8 : 0); - - const uint8_t* dispbase = &buffer[off]; - if (op_byte & 0x40) { - if (UNLIKELY((off += 1) > len)) - return FD_ERR_PARTIAL; - instr->disp = (int8_t) LOAD_LE_1(dispbase) * (1 << dispscale); - } else if (op_byte & 0x80 || (op_byte < 0x40 && base == 5)) { - if (UNLIKELY((off += 4) > len)) - return FD_ERR_PARTIAL; - instr->disp = (int32_t) LOAD_LE_4(dispbase); - } else { - instr->disp = 0; - } - end_modrm:; - } - } - - if (UNLIKELY(DESC_HAS_VEXREG(desc))) - { - FdOp* operand = &instr->operands[DESC_VEXREG_IDX(desc)]; - if (DESC_ZEROREG_VAL(desc)) { - operand->type = FD_OT_REG; - operand->size = 1; - operand->reg = FD_REG_CL; - operand->misc = FD_RT_GPL; - } else { - operand->type = FD_OT_REG; - // Without VEX prefix, this encodes an implicit register - operand->size = operand_sizes[DESC_VEXREG_SIZE(desc)]; - if (mode == DECODE_32) - vex_operand &= 0x7; - // Note: 32-bit will never UD here. EVEX.V' is caught above already. - // Note: UD if > 16 for non-VEC. No EVEX-encoded instruction uses - // EVEX.vvvv to refer to non-vector registers. Verified in parseinstrs. - operand->reg = vex_operand; - - unsigned reg_ty = DESC_REGTY_VEXREG(desc); // VEC GPL MSK FPU/TMM - if (prefix_rex & PREFIX_VEX) { // TMM with VEX, FPU otherwise - // In 64-bit mode: UD if FD_RT_MASK and vex_operand&8 != 0 - if (reg_ty == 2 && vex_operand >= 8) - return FD_ERR_UD; - if (UNLIKELY(reg_ty == 3)) // TMM - operand->reg &= 0x7; // TODO: verify - operand->misc = (06710 >> (3 * reg_ty)) & 0x7; - } else { - operand->misc = (04710 >> (3 * reg_ty)) & 0x7; - } - } - } - else if (vex_operand != 0) - { - // TODO: bit 3 ignored in 32-bit mode? unverified - return FD_ERR_UD; - } - - uint32_t imm_control = UNLIKELY(DESC_IMM_CONTROL(desc)); - if (LIKELY(!imm_control)) { - } else if (UNLIKELY(imm_control == 1)) - { - // 1 = immediate constant 1, used for shifts - FdOp* operand = &instr->operands[DESC_IMM_IDX(desc)]; - operand->type = FD_OT_IMM; - operand->size = 1; - instr->imm = 1; - } - else if (UNLIKELY(imm_control == 2)) - { - // 2 = memory, address-sized, used for mov with moffs operand - FdOp* operand = &instr->operands[DESC_IMM_IDX(desc)]; - operand->type = FD_OT_MEM; - operand->size = operand_sizes[DESC_IMM_SIZE(desc)]; - operand->reg = FD_REG_NONE; - operand->misc = FD_REG_NONE; - - int moffsz = 1 << addr_size; - if (UNLIKELY(off + moffsz > len)) - return FD_ERR_PARTIAL; - if (moffsz == 2) - instr->disp = LOAD_LE_2(&buffer[off]); - if (moffsz == 4) - instr->disp = LOAD_LE_4(&buffer[off]); - if (LIKELY(moffsz == 8)) - instr->disp = LOAD_LE_8(&buffer[off]); - off += moffsz; - } - else if (UNLIKELY(imm_control == 3)) - { - // 3 = register in imm8[7:4], used for RVMR encoding with VBLENDVP[SD] - FdOp* operand = &instr->operands[DESC_IMM_IDX(desc)]; - operand->type = FD_OT_REG; - operand->size = op_size; - operand->misc = FD_RT_VEC; - - if (UNLIKELY(off + 1 > len)) - return FD_ERR_PARTIAL; - uint8_t reg = (uint8_t) LOAD_LE_1(&buffer[off]); - off += 1; - - if (mode == DECODE_32) - reg &= 0x7f; - operand->reg = reg >> 4; - instr->imm = reg & 0x0f; - } - else if (imm_control != 0) - { - // 4/5 = immediate, operand-sized/8 bit - // 6/7 = offset, operand-sized/8 bit (used for jumps/calls) - int imm_byte = imm_control & 1; - int imm_offset = imm_control & 2; - - FdOp* operand = &instr->operands[DESC_IMM_IDX(desc)]; - operand->type = FD_OT_IMM; - - if (imm_byte) { - if (UNLIKELY(off + 1 > len)) - return FD_ERR_PARTIAL; - instr->imm = (int8_t) LOAD_LE_1(&buffer[off++]); - operand->size = DESC_IMM_SIZE(desc) & 1 ? 1 : op_size; - } else { - operand->size = operand_sizes[DESC_IMM_SIZE(desc)]; - - uint8_t imm_size; - if (UNLIKELY(instr->type == FDI_RET || instr->type == FDI_RETF || - instr->type == FDI_SSE_EXTRQ || - instr->type == FDI_SSE_INSERTQ)) - imm_size = 2; - else if (UNLIKELY(instr->type == FDI_JMPF || instr->type == FDI_CALLF)) - imm_size = (1 << op_size >> 1) + 2; - else if (UNLIKELY(instr->type == FDI_ENTER)) - imm_size = 3; - else if (instr->type == FDI_MOVABS) - imm_size = (1 << op_size >> 1); - else - imm_size = op_size == 2 ? 2 : 4; - - if (UNLIKELY(off + imm_size > len)) - return FD_ERR_PARTIAL; - - if (imm_size == 2) - instr->imm = (int16_t) LOAD_LE_2(&buffer[off]); - else if (imm_size == 3) - instr->imm = LOAD_LE_3(&buffer[off]); - else if (imm_size == 4) - instr->imm = (int32_t) LOAD_LE_4(&buffer[off]); - else if (imm_size == 6) - instr->imm = LOAD_LE_4(&buffer[off]) | LOAD_LE_2(&buffer[off+4]) << 32; - else if (imm_size == 8) - instr->imm = (int64_t) LOAD_LE_8(&buffer[off]); - off += imm_size; - } - - if (imm_offset) - { - if (instr->address != 0) - instr->imm += instr->address + off; - else - operand->type = FD_OT_OFF; - } - } - -skip_modrm: - if (UNLIKELY(prefixes[PF_LOCK])) { - if (!DESC_LOCK(desc) || instr->operands[0].type != FD_OT_MEM) - return FD_ERR_UD; - instr->flags |= FD_FLAG_LOCK; - } - - if (UNLIKELY(DESC_LEGACY(desc))) { - // Without REX prefix, convert one-byte GP regs to high-byte regs - // This actually only applies to SZ8/MOVSX/MOVZX; but no VEX-encoded - // instructions have a byte-sized GP register in the first two operands. - if (!(prefix_rex & PREFIX_REX)) { - for (int i = 0; i < 2; i++) { - FdOp* operand = &instr->operands[i]; - if (operand->type == FD_OT_NONE) - break; - if (operand->type == FD_OT_REG && operand->misc == FD_RT_GPL && - operand->size == 1 && operand->reg >= 4) - operand->misc = FD_RT_GPH; - } - } - - if (instr->type == FDI_XCHG_NOP) { - // Only 4890, 90, and 6690 are true NOPs. - if (instr->operands[0].reg == 0) { - instr->operands[0].type = FD_OT_NONE; - instr->operands[1].type = FD_OT_NONE; - instr->type = FD_HAS_REP(instr) ? FDI_PAUSE : FDI_NOP; - } else if ((instr->operands[0].reg & 7) == 0 && FD_HAS_REP(instr)) { - // On Intel, REX.B is ignored for F3.90. - instr->operands[0].type = FD_OT_NONE; - instr->operands[1].type = FD_OT_NONE; - instr->type = FDI_PAUSE; - } else { - instr->type = FDI_XCHG; - } - } - - if (UNLIKELY(instr->type == FDI_3DNOW)) { - unsigned opc3dn = instr->imm; - if (opc3dn & 0x40) - return FD_ERR_UD; - uint64_t msk = opc3dn & 0x80 ? 0x88d144d144d14400 : 0x30003000; - if (!(msk >> (opc3dn & 0x3f) & 1)) - return FD_ERR_UD; - } - - instr->operandsz = UNLIKELY(DESC_INSTR_WIDTH(desc)) ? op_size - 1 : 0; - } else { - instr->operandsz = 0; - } - - instr->size = off; - - return off; -} diff --git a/third_party/fadec/encode-test.c b/third_party/fadec/encode-test.c deleted file mode 100644 index bc4a8d6..0000000 --- a/third_party/fadec/encode-test.c +++ /dev/null @@ -1,62 +0,0 @@ - -#include -#include -#include -#include - -#include - - -static -void -print_hex(const uint8_t* buf, size_t len) -{ - for (size_t i = 0; i < len; i++) - printf("%02x", buf[i]); -} - -static -int -test(uint8_t* buf, const char* name, uint64_t mnem, uint64_t op0, uint64_t op1, uint64_t op2, uint64_t op3, const void* exp, size_t exp_len) -{ - memset(buf, 0, 16); - - uint8_t* inst = buf; - int res = fe_enc64(&inst, mnem, op0, op1, op2, op3); - if ((res != 0) != (exp_len == 0)) goto fail; - if (inst - buf != (ptrdiff_t) exp_len) goto fail; - if (memcmp(buf, exp, exp_len)) goto fail; - - return 0; - -fail: - printf("Failed case %s:\n", name); - printf(" Exp (%2zu): ", exp_len); - print_hex(exp, exp_len); - printf("\n Got (%2zd): ", inst - buf); - print_hex(buf, inst - buf); - printf("\n"); - return -1; -} - -#define TEST2(str, exp, exp_len, mnem, flags, op0, op1, op2, op3, ...) test(buf, str, FE_ ## mnem|flags, op0, op1, op2, op3, exp, exp_len) -#define TEST1(str, exp, ...) TEST2(str, exp, sizeof(exp)-1, __VA_ARGS__, 0, 0, 0, 0, 0) -#define TEST(exp, ...) failed |= TEST1(#__VA_ARGS__, exp, __VA_ARGS__) - -int -main(int argc, char** argv) -{ - (void) argc; (void) argv; - - int failed = 0; - uint8_t buf[16]; - - // VSIB encoding doesn't differ for this API -#define FE_MEMV FE_MEM -#define FE_PTR(off) ((intptr_t) buf + (off)) -#define FLAGMASK(flags, mask) (flags | FE_MASK(mask & 7)) -#include "encode-test.inc" - - puts(failed ? "Some tests FAILED" : "All tests PASSED"); - return failed ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/third_party/fadec/encode-test.inc b/third_party/fadec/encode-test.inc deleted file mode 100644 index d1d400c..0000000 --- a/third_party/fadec/encode-test.inc +++ /dev/null @@ -1,2192 +0,0 @@ - -TEST("\00\xe0", ADD8rr, 0, FE_AX, FE_AH); -TEST("", ADD8rr, 0, FE_SI, FE_AH); -TEST("\xeb\xfe", JMP, 0, FE_PTR(0)); -TEST("\xeb\x7f", JMP, 0, FE_PTR(129)); -TEST("\xe9\x7d\x00\x00\x00", JMP, 0, FE_PTR(130)); -TEST("\xeb\x80", JMP, 0, FE_PTR(-126)); -TEST("\xe9\x7c\xff\xff\xff", JMP, 0, FE_PTR(-127)); -TEST("\xe9\xfb\xff\xff\xff", JMP, FE_JMPL, FE_PTR(0)); -TEST("\xe9\x00\x00\x00\x00", JMP, FE_JMPL, FE_PTR(5)); -TEST("\x75\x00", JNZ, 0, FE_PTR(2)); -TEST("\x0f\x85\x00\x00\x00\x00", JNZ, FE_JMPL, FE_PTR(6)); -TEST("\x70\x7f", JO, 0, FE_PTR(129)); -TEST("\x0f\x80\x7c\x00\x00\x00", JO, 0, FE_PTR(130)); -TEST("\x70\x80", JO, 0, FE_PTR(-126)); -TEST("\x0f\x80\x7b\xff\xff\xff", JO, 0, FE_PTR(-127)); -TEST("\xe3\xfc", JCXZ, 0, FE_PTR(-2)); -TEST("\x67\xe3\xfb", JCXZ, FE_ADDR32, FE_PTR(-2)); -TEST("\xe3\xfc", JCXZ, FE_JMPL, FE_PTR(-2)); -TEST("\xac", LODS8, 0); -TEST("\x67\xac", LODS8, FE_ADDR32); -TEST("\x50", PUSHr, 0, FE_AX); -TEST("\x66\x50", PUSH16r, 0, FE_AX); -TEST("\x54", PUSHr, 0, FE_SP); -TEST("\x41\x57", PUSHr, 0, FE_R15); -TEST("\x41\x50", PUSHr, 0, FE_R8); -TEST("", PUSH_SEGr, 0, FE_ES); -TEST("", PUSH_SEG16r, 0, FE_ES); -TEST("", PUSH_SEGr, 0, FE_CS); -TEST("", PUSH_SEG16r, 0, FE_CS); -TEST("", PUSH_SEGr, 0, FE_SS); -TEST("", PUSH_SEG16r, 0, FE_SS); -TEST("", PUSH_SEGr, 0, FE_DS); -TEST("", PUSH_SEG16r, 0, FE_DS); -TEST("\x0f\xa0", PUSH_SEGr, 0, FE_FS); -TEST("\x66\x0f\xa0", PUSH_SEG16r, 0, FE_FS); -TEST("\x0f\xa8", PUSH_SEGr, 0, FE_GS); -TEST("\x66\x0f\xa8", PUSH_SEG16r, 0, FE_GS); -TEST("\xff\x30", PUSHm, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xff\x31", PUSHm, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0)); -TEST("\x9c", PUSHF, 0); -TEST("\x8c\xc0", MOV_S2Grr, 0, FE_AX, FE_ES); -TEST("\x8c\xc8", MOV_S2Grr, 0, FE_AX, FE_CS); -TEST("\x8c\xd0", MOV_S2Grr, 0, FE_AX, FE_SS); -TEST("\x8c\xd8", MOV_S2Grr, 0, FE_AX, FE_DS); -TEST("\x8c\xe0", MOV_S2Grr, 0, FE_AX, FE_FS); -TEST("\x8c\xe8", MOV_S2Grr, 0, FE_AX, FE_GS); -TEST("\x8e\xc0", MOV_G2Srr, 0, FE_ES, FE_AX); -// TEST("", MOV_G2Srr, 0, FE_CS, FE_AX); -TEST("\x8e\xd0", MOV_G2Srr, 0, FE_SS, FE_AX); -TEST("\x8e\xd8", MOV_G2Srr, 0, FE_DS, FE_AX); -TEST("\x8e\xe0", MOV_G2Srr, 0, FE_FS, FE_AX); -TEST("\x8e\xe8", MOV_G2Srr, 0, FE_GS, FE_AX); -TEST("\xd2\xe4", SHL8rr, 0, FE_AH, FE_CX); -TEST("", SHL8rr, 0, FE_AH, FE_DX); -TEST("\xd0\xe0", SHL8ri, 0, FE_AX, 1); -TEST("\xc0\xe0\x02", SHL8ri, 0, FE_AX, 2); -TEST("\xc1\xe0\x02", SHL32ri, 0, FE_AX, 2); -TEST("\x48\xc1\xe0\x02", SHL64ri, 0, FE_AX, 2); -TEST("\x48\xf7\x28", IMUL64m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc2\x00\x00", RETi, 0, 0); -TEST("\xff\xd0", CALLr, 0, FE_AX); -TEST("\x83\xc0\x7f", ADD32ri, 0, FE_AX, 0x7f); -TEST("\x05\x80\x00\x00\x00", ADD32ri, 0, FE_AX, 0x80); -TEST("\x05\x00\x01\x00\x00", ADD32ri, 0, FE_AX, 0x100); -TEST("\x66\x05\x00\x01", ADD16ri, 0, FE_AX, 0x100); -#ifndef ENC_TEST_TYPESAFE -TEST("", ADD16ri, 0, FE_AX, 0x12345); -TEST("\x66\x05\xff\xee", ADD16ri, 0, FE_AX, 0xffffffffffffeeff); -#endif -TEST("\xb8\x05\x00\x01\x00", MOV32ri, 0, FE_AX, 0x10005); -TEST("\xb8\xff\xff\xff\x7f", MOV32ri, 0, FE_AX, 0x7fffffff); -TEST("\x48\xb8\x05\x00\x01\x00\xff\x00\x00\x00", MOV64ri, 0, FE_AX, 0xff00010005); -TEST("\x48\xc7\xc0\x00\x00\x00\x00", MOV64ri, 0, FE_AX, 0x0); -TEST("\x48\xc7\xc0\x00\x00\x00\x80", MOV64ri, 0, FE_AX, (int32_t) 0x80000000); -TEST("\x48\xb8\x00\x00\x00\x00\x00\x00\x00\x80", MOV64ri, 0, FE_AX, INT64_MIN); -TEST("\x48\xb8\x00\x00\x00\x80\x00\x00\x00\x00", MOV64ri, 0, FE_AX, 0x80000000); -TEST("\xb0\xff", MOV8ri, 0, FE_AX, (int8_t) 0xff); -TEST("\xb4\xff", MOV8ri, 0, FE_AH, -1); -TEST("\xb7\x64", MOV8ri, 0, FE_BH, 0x64); -TEST("\x40\xb6\x64", MOV8ri, 0, FE_SI, 0x64); -TEST("\x41\xb6\x64", MOV8ri, 0, FE_R14, 0x64); -TEST("\x66\x0f\xbe\xc2", MOVSXr16r8, 0, FE_AX, FE_DX); -TEST("\x0f\xbe\xc2", MOVSXr32r8, 0, FE_AX, FE_DX); -TEST("\x48\x0f\xbe\xc2", MOVSXr64r8, 0, FE_AX, FE_DX); -TEST("\x66\x0f\xbe\xc6", MOVSXr16r8, 0, FE_AX, FE_DH); -TEST("\x0f\xbe\xc6", MOVSXr32r8, 0, FE_AX, FE_DH); -TEST("", MOVSXr64r8, 0, FE_AX, FE_DH); -TEST("\x66\x0f\xbf\xc2", MOVSXr16r16, 0, FE_AX, FE_DX); -TEST("\x0f\xbf\xc2", MOVSXr32r16, 0, FE_AX, FE_DX); -TEST("\x48\x0f\xbf\xc2", MOVSXr64r16, 0, FE_AX, FE_DX); -TEST("\x66\x63\xc2", MOVSXr16r32, 0, FE_AX, FE_DX); -TEST("\x63\xc2", MOVSXr32r32, 0, FE_AX, FE_DX); -TEST("\x48\x63\xc2", MOVSXr64r32, 0, FE_AX, FE_DX); -TEST("\xc8\x33\x22\x11", ENTERi, 0, 0x112233); -TEST("", ENTERi, 0, 0x1112233); -TEST("\x0f\x05", SYSCALL, 0); -TEST("\x0f\x90\xc4", SETO8r, 0, FE_AH); -TEST("\x40\x0f\x90\xc4", SETO8r, 0, FE_SP); -TEST("\x41\x0f\x90\xc4", SETO8r, 0, FE_R12); -TEST("\xf3\x0f\xb8\xc2", POPCNT32rr, 0, FE_AX, FE_DX); -TEST("\x66\xf3\x0f\xb8\xc2", POPCNT16rr, 0, FE_AX, FE_DX); -TEST("\xf3\x48\x0f\xb8\xc2", POPCNT64rr, 0, FE_AX, FE_DX); -TEST("\x0f\xbc\xc2", BSF32rr, 0, FE_AX, FE_DX); -TEST("\x66\x0f\xbc\xc2", BSF16rr, 0, FE_AX, FE_DX); -TEST("\x0f\x01\xd0", XGETBV, 0); -TEST("\x41\x90", XCHG32rr, 0, FE_R8, FE_AX); -TEST("\x91", XCHG32rr, 0, FE_CX, FE_AX); -TEST("\x66\x90", XCHG16rr, 0, FE_AX, FE_AX); -TEST("\x87\xc0", XCHG32rr, 0, FE_AX, FE_AX); -TEST("\x48\x90", XCHG64rr, 0, FE_AX, FE_AX); -TEST("\x87\x00", XCHG32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x87\x08", XCHG32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX); -TEST("\x90", NOP, 0); -TEST("\xf3\x90", PAUSE, 0); -TEST("\x0f\x1f\xc0", NOP32r, 0, FE_AX); -TEST("\x26\x01\x00", ADD32mr, FE_SEG(FE_ES), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x2e\x01\x00", ADD32mr, FE_SEG(FE_CS), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x36\x01\x00", ADD32mr, FE_SEG(FE_SS), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x3e\x01\x00", ADD32mr, FE_SEG(FE_DS), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x64\x01\x00", ADD32mr, FE_SEG(FE_FS), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x65\x01\x00", ADD32mr, FE_SEG(FE_GS), FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x8e\xc0", MOV_G2Srr, 0, FE_ES, FE_AX); -TEST("\xae", SCAS8, 0); -TEST("\xf2\xae", REPNZ_SCAS8, 0); -TEST("\xf3\xae", REPZ_SCAS8, 0); -TEST("\x66\xab", STOS16, 0); -TEST("\x66\xf3\xab", REP_STOS16, 0); -TEST("\xab", STOS32, 0); -TEST("\xf3\xab", REP_STOS32, 0); -TEST("\x48\xab", STOS64, 0); -TEST("\xf3\x48\xab", REP_STOS64, 0); -TEST("\x6c", INS8, 0); -TEST("\x67\x6c", INS8, FE_ADDR32); -TEST("\x66\x6d", INS16, 0); -TEST("\x67\x66\x6d", INS16, FE_ADDR32); -TEST("\x6d", INS32, 0); -TEST("\x67\x6d", INS32, FE_ADDR32); -TEST("\x0f\x38\xf0\x11", MOVBE32rm, 0, FE_DX, FE_MEM(FE_CX, 0, FE_NOREG, 0)); -TEST("\x66\x0f\x38\xf0\x11", MOVBE16rm, 0, FE_DX, FE_MEM(FE_CX, 0, FE_NOREG, 0)); -TEST("\x48\x0f\x38\xf0\x11", MOVBE64rm, 0, FE_DX, FE_MEM(FE_CX, 0, FE_NOREG, 0)); -TEST("\xf2\x0f\x38\xf0\xc1", CRC32_8rr, 0, FE_AX, FE_CX); -TEST("\xf2\x0f\x38\xf0\xc5", CRC32_8rr, 0, FE_AX, FE_CH); -TEST("\xf2\x0f\x38\xf1\xc1", CRC32_32rr, 0, FE_AX, FE_CX); -TEST("\x66\xf2\x0f\x38\xf1\xc1", CRC32_16rr, 0, FE_AX, FE_CX); -TEST("\x66\xf2\x41\x0f\x38\xf1\xc2", CRC32_16rr, 0, FE_AX, FE_R10); -TEST("\x0f\xc7\xf7", RDRAND32r, 0, FE_DI); -TEST("\x66\x0f\xc7\xf7", RDRAND16r, 0, FE_DI); -TEST("\x48\x0f\xc7\xf7", RDRAND64r, 0, FE_DI); -TEST("\x0f\xc7\xff", RDSEED32r, 0, FE_DI); -TEST("\x66\x0f\xc7\xff", RDSEED16r, 0, FE_DI); -TEST("\x48\x0f\xc7\xff", RDSEED64r, 0, FE_DI); -TEST("\xf3\x0f\xc7\xff", RDPIDr, 0, FE_DI); -TEST("\x66\x0f\x3a\x14\xc1\x02", SSE_PEXTRBrri, 0, FE_CX, FE_XMM0, 2); -TEST("\x66\x0f\x3a\x20\xc1\x02", SSE_PINSRBrri, 0, FE_XMM0, FE_CX, 2); -#ifndef ENC_TEST_TYPESAFE -TEST("", SSE_PEXTRBrri, 0, FE_CH, FE_XMM0, 2); -TEST("", SSE_PINSRBrri, 0, FE_XMM0, FE_CH, 2); -#endif -TEST("\x66\x0f\xf7\xc1", SSE_MASKMOVDQUrr, 0, FE_XMM0, FE_XMM1); -TEST("\x67\x66\x0f\xf7\xc1", SSE_MASKMOVDQUrr, FE_ADDR32, FE_XMM0, FE_XMM1); -TEST("\x66\x0f\x6e\xc1", SSE_MOVD_G2Xrr, 0, FE_XMM0, FE_CX); -TEST("\x66\x41\x0f\x6e\xc1", SSE_MOVD_G2Xrr, 0, FE_XMM0, FE_R9); -TEST("\x66\x44\x0f\x6e\xc1", SSE_MOVD_G2Xrr, 0, FE_XMM8, FE_CX); -TEST("\x66\x45\x0f\x6e\xc1", SSE_MOVD_G2Xrr, 0, FE_XMM8, FE_R9); -TEST("\x66\x48\x0f\x6e\xc1", SSE_MOVQ_G2Xrr, 0, FE_XMM0, FE_CX); -TEST("\x66\x49\x0f\x6e\xc1", SSE_MOVQ_G2Xrr, 0, FE_XMM0, FE_R9); -TEST("\x66\x4c\x0f\x6e\xc1", SSE_MOVQ_G2Xrr, 0, FE_XMM8, FE_CX); -TEST("\x66\x4d\x0f\x6e\xc1", SSE_MOVQ_G2Xrr, 0, FE_XMM8, FE_R9); -TEST("\x66\x0f\x7e\xc1", SSE_MOVD_X2Grr, 0, FE_CX, FE_XMM0); -TEST("\x66\x41\x0f\x7e\xc1", SSE_MOVD_X2Grr, 0, FE_R9, FE_XMM0); -TEST("\x66\x44\x0f\x7e\xc1", SSE_MOVD_X2Grr, 0, FE_CX, FE_XMM8); -TEST("\x66\x45\x0f\x7e\xc1", SSE_MOVD_X2Grr, 0, FE_R9, FE_XMM8); -TEST("\x66\x48\x0f\x7e\xc1", SSE_MOVQ_X2Grr, 0, FE_CX, FE_XMM0); -TEST("\x66\x49\x0f\x7e\xc1", SSE_MOVQ_X2Grr, 0, FE_R9, FE_XMM0); -TEST("\x66\x4c\x0f\x7e\xc1", SSE_MOVQ_X2Grr, 0, FE_CX, FE_XMM8); -TEST("\x66\x4d\x0f\x7e\xc1", SSE_MOVQ_X2Grr, 0, FE_R9, FE_XMM8); -TEST("\x0f\xae\xe8", LFENCE, 0); -TEST("\x0f\xae\xf0", MFENCE, 0); -TEST("\x0f\xae\xf8", SFENCE, 0); -TEST("\x66\x98", C_EX16, 0); -TEST("\x66\x98", CBW, 0); -TEST("\x98", C_EX32, 0); -TEST("\x98", CWDE, 0); -TEST("\x48\x98", C_EX64, 0); -TEST("\x48\x98", CDQE, 0); -TEST("\x66\x99", C_SEP16, 0); -TEST("\x66\x99", CWD, 0); -TEST("\x99", C_SEP32, 0); -TEST("\x99", CDQ, 0); -TEST("\x48\x99", C_SEP64, 0); -TEST("\x48\x99", CQO, 0); -TEST("\x0f\xc7\x0f", CMPXCHGD32m, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0)); -TEST("\x0f\xc7\x0f", CMPXCHG8Bm, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0)); -TEST("\x48\x0f\xc7\x0f", CMPXCHGD64m, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0)); -TEST("\x48\x0f\xc7\x0f", CMPXCHG16Bm, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0)); - -// Condition codes -TEST("\x70\x00", JO, 0, FE_PTR(2)); -TEST("\x70\x00", Jcc, FE_CC_O, FE_PTR(2)); -TEST("\x0f\x80\x00\x00\x00\x00", JO, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x80\x00\x00\x00\x00", Jcc, FE_CC_O|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x80\x7c\x00\x00\x00", JO, 0, FE_PTR(130)); -TEST("\x0f\x80\x7c\x00\x00\x00", Jcc, FE_CC_O, FE_PTR(130)); -TEST("\x0f\x90\xc0", SETO8r, 0, FE_AX); -TEST("\x0f\x90\xc0", SETcc8r, FE_CC_O, FE_AX); -TEST("\x0f\x90\x00", SETO8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x90\x00", SETcc8m, FE_CC_O, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x90\x00", SETO8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x90\x00", SETcc8m, FE_CC_O|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x40\xc0", CMOVO32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x40\xc0", CMOVcc32rr, FE_CC_O, FE_AX, FE_AX); -TEST("\x0f\x40\x00", CMOVO32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x40\x00", CMOVcc32rm, FE_CC_O, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x40\x00", CMOVO32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x40\x00", CMOVcc32rm, FE_CC_O|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe0\x08", CMPOXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe0\x08", CMPccXADD32mrr, FE_CC_O, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe0\x08", CMPOXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe0\x08", CMPccXADD64mrr, FE_CC_O, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x71\x00", JNO, 0, FE_PTR(2)); -TEST("\x71\x00", Jcc, FE_CC_NO, FE_PTR(2)); -TEST("\x0f\x81\x00\x00\x00\x00", JNO, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x81\x00\x00\x00\x00", Jcc, FE_CC_NO|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x81\x7c\x00\x00\x00", JNO, 0, FE_PTR(130)); -TEST("\x0f\x81\x7c\x00\x00\x00", Jcc, FE_CC_NO, FE_PTR(130)); -TEST("\x0f\x91\xc0", SETNO8r, 0, FE_AX); -TEST("\x0f\x91\xc0", SETcc8r, FE_CC_NO, FE_AX); -TEST("\x0f\x91\x00", SETNO8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x91\x00", SETcc8m, FE_CC_NO, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x91\x00", SETNO8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x91\x00", SETcc8m, FE_CC_NO|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x41\xc0", CMOVNO32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x41\xc0", CMOVcc32rr, FE_CC_NO, FE_AX, FE_AX); -TEST("\x0f\x41\x00", CMOVNO32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x41\x00", CMOVcc32rm, FE_CC_NO, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x41\x00", CMOVNO32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x41\x00", CMOVcc32rm, FE_CC_NO|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe1\x08", CMPNOXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe1\x08", CMPccXADD32mrr, FE_CC_NO, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe1\x08", CMPNOXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe1\x08", CMPccXADD64mrr, FE_CC_NO, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x72\x00", JC, 0, FE_PTR(2)); -TEST("\x72\x00", Jcc, FE_CC_C, FE_PTR(2)); -TEST("\x0f\x82\x00\x00\x00\x00", JC, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x82\x00\x00\x00\x00", Jcc, FE_CC_C|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x82\x7c\x00\x00\x00", JC, 0, FE_PTR(130)); -TEST("\x0f\x82\x7c\x00\x00\x00", Jcc, FE_CC_C, FE_PTR(130)); -TEST("\x0f\x92\xc0", SETC8r, 0, FE_AX); -TEST("\x0f\x92\xc0", SETcc8r, FE_CC_C, FE_AX); -TEST("\x0f\x92\x00", SETC8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x92\x00", SETcc8m, FE_CC_C, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x92\x00", SETC8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x92\x00", SETcc8m, FE_CC_C|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x42\xc0", CMOVC32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x42\xc0", CMOVcc32rr, FE_CC_C, FE_AX, FE_AX); -TEST("\x0f\x42\x00", CMOVC32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x42\x00", CMOVcc32rm, FE_CC_C, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x42\x00", CMOVC32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x42\x00", CMOVcc32rm, FE_CC_C|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe2\x08", CMPBXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe2\x08", CMPccXADD32mrr, FE_CC_B, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe2\x08", CMPBXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe2\x08", CMPccXADD64mrr, FE_CC_B, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x73\x00", JNC, 0, FE_PTR(2)); -TEST("\x73\x00", Jcc, FE_CC_NC, FE_PTR(2)); -TEST("\x0f\x83\x00\x00\x00\x00", JNC, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x83\x00\x00\x00\x00", Jcc, FE_CC_NC|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x83\x7c\x00\x00\x00", JNC, 0, FE_PTR(130)); -TEST("\x0f\x83\x7c\x00\x00\x00", Jcc, FE_CC_NC, FE_PTR(130)); -TEST("\x0f\x93\xc0", SETNC8r, 0, FE_AX); -TEST("\x0f\x93\xc0", SETcc8r, FE_CC_NC, FE_AX); -TEST("\x0f\x93\x00", SETNC8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x93\x00", SETcc8m, FE_CC_NC, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x93\x00", SETNC8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x93\x00", SETcc8m, FE_CC_NC|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x43\xc0", CMOVNC32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x43\xc0", CMOVcc32rr, FE_CC_NC, FE_AX, FE_AX); -TEST("\x0f\x43\x00", CMOVNC32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x43\x00", CMOVcc32rm, FE_CC_NC, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x43\x00", CMOVNC32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x43\x00", CMOVcc32rm, FE_CC_NC|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe3\x08", CMPNBXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe3\x08", CMPccXADD32mrr, FE_CC_NB, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe3\x08", CMPNBXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe3\x08", CMPccXADD64mrr, FE_CC_NB, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x74\x00", JZ, 0, FE_PTR(2)); -TEST("\x74\x00", Jcc, FE_CC_Z, FE_PTR(2)); -TEST("\x0f\x84\x00\x00\x00\x00", JZ, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x84\x00\x00\x00\x00", Jcc, FE_CC_Z|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x84\x7c\x00\x00\x00", JZ, 0, FE_PTR(130)); -TEST("\x0f\x84\x7c\x00\x00\x00", Jcc, FE_CC_Z, FE_PTR(130)); -TEST("\x0f\x94\xc0", SETZ8r, 0, FE_AX); -TEST("\x0f\x94\xc0", SETcc8r, FE_CC_Z, FE_AX); -TEST("\x0f\x94\x00", SETZ8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x94\x00", SETcc8m, FE_CC_Z, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x94\x00", SETZ8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x94\x00", SETcc8m, FE_CC_Z|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x44\xc0", CMOVZ32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x44\xc0", CMOVcc32rr, FE_CC_Z, FE_AX, FE_AX); -TEST("\x0f\x44\x00", CMOVZ32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x44\x00", CMOVcc32rm, FE_CC_Z, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x44\x00", CMOVZ32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x44\x00", CMOVcc32rm, FE_CC_Z|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe4\x08", CMPZXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe4\x08", CMPccXADD32mrr, FE_CC_Z, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe4\x08", CMPZXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe4\x08", CMPccXADD64mrr, FE_CC_Z, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x75\x00", JNZ, 0, FE_PTR(2)); -TEST("\x75\x00", Jcc, FE_CC_NZ, FE_PTR(2)); -TEST("\x0f\x85\x00\x00\x00\x00", JNZ, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x85\x00\x00\x00\x00", Jcc, FE_CC_NZ|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x85\x7c\x00\x00\x00", JNZ, 0, FE_PTR(130)); -TEST("\x0f\x85\x7c\x00\x00\x00", Jcc, FE_CC_NZ, FE_PTR(130)); -TEST("\x0f\x95\xc0", SETNZ8r, 0, FE_AX); -TEST("\x0f\x95\xc0", SETcc8r, FE_CC_NZ, FE_AX); -TEST("\x0f\x95\x00", SETNZ8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x95\x00", SETcc8m, FE_CC_NZ, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x95\x00", SETNZ8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x95\x00", SETcc8m, FE_CC_NZ|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x45\xc0", CMOVNZ32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x45\xc0", CMOVcc32rr, FE_CC_NZ, FE_AX, FE_AX); -TEST("\x0f\x45\x00", CMOVNZ32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x45\x00", CMOVcc32rm, FE_CC_NZ, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x45\x00", CMOVNZ32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x45\x00", CMOVcc32rm, FE_CC_NZ|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe5\x08", CMPNZXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe5\x08", CMPccXADD32mrr, FE_CC_NZ, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe5\x08", CMPNZXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe5\x08", CMPccXADD64mrr, FE_CC_NZ, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x76\x00", JBE, 0, FE_PTR(2)); -TEST("\x76\x00", Jcc, FE_CC_BE, FE_PTR(2)); -TEST("\x0f\x86\x00\x00\x00\x00", JBE, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x86\x00\x00\x00\x00", Jcc, FE_CC_BE|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x86\x7c\x00\x00\x00", JBE, 0, FE_PTR(130)); -TEST("\x0f\x86\x7c\x00\x00\x00", Jcc, FE_CC_BE, FE_PTR(130)); -TEST("\x0f\x96\xc0", SETBE8r, 0, FE_AX); -TEST("\x0f\x96\xc0", SETcc8r, FE_CC_BE, FE_AX); -TEST("\x0f\x96\x00", SETBE8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x96\x00", SETcc8m, FE_CC_BE, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x96\x00", SETBE8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x96\x00", SETcc8m, FE_CC_BE|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x46\xc0", CMOVBE32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x46\xc0", CMOVcc32rr, FE_CC_BE, FE_AX, FE_AX); -TEST("\x0f\x46\x00", CMOVBE32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x46\x00", CMOVcc32rm, FE_CC_BE, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x46\x00", CMOVBE32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x46\x00", CMOVcc32rm, FE_CC_BE|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe6\x08", CMPBEXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe6\x08", CMPccXADD32mrr, FE_CC_BE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe6\x08", CMPBEXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe6\x08", CMPccXADD64mrr, FE_CC_BE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x77\x00", JA, 0, FE_PTR(2)); -TEST("\x77\x00", Jcc, FE_CC_A, FE_PTR(2)); -TEST("\x0f\x87\x00\x00\x00\x00", JA, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x87\x00\x00\x00\x00", Jcc, FE_CC_A|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x87\x7c\x00\x00\x00", JA, 0, FE_PTR(130)); -TEST("\x0f\x87\x7c\x00\x00\x00", Jcc, FE_CC_A, FE_PTR(130)); -TEST("\x0f\x97\xc0", SETA8r, 0, FE_AX); -TEST("\x0f\x97\xc0", SETcc8r, FE_CC_A, FE_AX); -TEST("\x0f\x97\x00", SETA8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x97\x00", SETcc8m, FE_CC_A, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x97\x00", SETA8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x97\x00", SETcc8m, FE_CC_A|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x47\xc0", CMOVA32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x47\xc0", CMOVcc32rr, FE_CC_A, FE_AX, FE_AX); -TEST("\x0f\x47\x00", CMOVA32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x47\x00", CMOVcc32rm, FE_CC_A, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x47\x00", CMOVA32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x47\x00", CMOVcc32rm, FE_CC_A|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe7\x08", CMPNBEXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe7\x08", CMPccXADD32mrr, FE_CC_NBE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe7\x08", CMPNBEXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe7\x08", CMPccXADD64mrr, FE_CC_NBE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x78\x00", JS, 0, FE_PTR(2)); -TEST("\x78\x00", Jcc, FE_CC_S, FE_PTR(2)); -TEST("\x0f\x88\x00\x00\x00\x00", JS, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x88\x00\x00\x00\x00", Jcc, FE_CC_S|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x88\x7c\x00\x00\x00", JS, 0, FE_PTR(130)); -TEST("\x0f\x88\x7c\x00\x00\x00", Jcc, FE_CC_S, FE_PTR(130)); -TEST("\x0f\x98\xc0", SETS8r, 0, FE_AX); -TEST("\x0f\x98\xc0", SETcc8r, FE_CC_S, FE_AX); -TEST("\x0f\x98\x00", SETS8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x98\x00", SETcc8m, FE_CC_S, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x98\x00", SETS8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x98\x00", SETcc8m, FE_CC_S|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x48\xc0", CMOVS32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x48\xc0", CMOVcc32rr, FE_CC_S, FE_AX, FE_AX); -TEST("\x0f\x48\x00", CMOVS32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x48\x00", CMOVcc32rm, FE_CC_S, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x48\x00", CMOVS32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x48\x00", CMOVcc32rm, FE_CC_S|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe8\x08", CMPSXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe8\x08", CMPccXADD32mrr, FE_CC_S, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe8\x08", CMPSXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe8\x08", CMPccXADD64mrr, FE_CC_S, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x79\x00", JNS, 0, FE_PTR(2)); -TEST("\x79\x00", Jcc, FE_CC_NS, FE_PTR(2)); -TEST("\x0f\x89\x00\x00\x00\x00", JNS, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x89\x00\x00\x00\x00", Jcc, FE_CC_NS|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x89\x7c\x00\x00\x00", JNS, 0, FE_PTR(130)); -TEST("\x0f\x89\x7c\x00\x00\x00", Jcc, FE_CC_NS, FE_PTR(130)); -TEST("\x0f\x99\xc0", SETNS8r, 0, FE_AX); -TEST("\x0f\x99\xc0", SETcc8r, FE_CC_NS, FE_AX); -TEST("\x0f\x99\x00", SETNS8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x99\x00", SETcc8m, FE_CC_NS, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x99\x00", SETNS8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x99\x00", SETcc8m, FE_CC_NS|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x49\xc0", CMOVNS32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x49\xc0", CMOVcc32rr, FE_CC_NS, FE_AX, FE_AX); -TEST("\x0f\x49\x00", CMOVNS32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x49\x00", CMOVcc32rm, FE_CC_NS, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x49\x00", CMOVNS32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x49\x00", CMOVcc32rm, FE_CC_NS|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xe9\x08", CMPNSXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xe9\x08", CMPccXADD32mrr, FE_CC_NS, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe9\x08", CMPNSXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xe9\x08", CMPccXADD64mrr, FE_CC_NS, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7a\x00", JP, 0, FE_PTR(2)); -TEST("\x7a\x00", Jcc, FE_CC_P, FE_PTR(2)); -TEST("\x0f\x8a\x00\x00\x00\x00", JP, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8a\x00\x00\x00\x00", Jcc, FE_CC_P|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8a\x7c\x00\x00\x00", JP, 0, FE_PTR(130)); -TEST("\x0f\x8a\x7c\x00\x00\x00", Jcc, FE_CC_P, FE_PTR(130)); -TEST("\x0f\x9a\xc0", SETP8r, 0, FE_AX); -TEST("\x0f\x9a\xc0", SETcc8r, FE_CC_P, FE_AX); -TEST("\x0f\x9a\x00", SETP8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9a\x00", SETcc8m, FE_CC_P, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9a\x00", SETP8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9a\x00", SETcc8m, FE_CC_P|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4a\xc0", CMOVP32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4a\xc0", CMOVcc32rr, FE_CC_P, FE_AX, FE_AX); -TEST("\x0f\x4a\x00", CMOVP32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4a\x00", CMOVcc32rm, FE_CC_P, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4a\x00", CMOVP32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4a\x00", CMOVcc32rm, FE_CC_P|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xea\x08", CMPPXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xea\x08", CMPccXADD32mrr, FE_CC_P, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xea\x08", CMPPXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xea\x08", CMPccXADD64mrr, FE_CC_P, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7b\x00", JNP, 0, FE_PTR(2)); -TEST("\x7b\x00", Jcc, FE_CC_NP, FE_PTR(2)); -TEST("\x0f\x8b\x00\x00\x00\x00", JNP, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8b\x00\x00\x00\x00", Jcc, FE_CC_NP|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8b\x7c\x00\x00\x00", JNP, 0, FE_PTR(130)); -TEST("\x0f\x8b\x7c\x00\x00\x00", Jcc, FE_CC_NP, FE_PTR(130)); -TEST("\x0f\x9b\xc0", SETNP8r, 0, FE_AX); -TEST("\x0f\x9b\xc0", SETcc8r, FE_CC_NP, FE_AX); -TEST("\x0f\x9b\x00", SETNP8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9b\x00", SETcc8m, FE_CC_NP, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9b\x00", SETNP8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9b\x00", SETcc8m, FE_CC_NP|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4b\xc0", CMOVNP32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4b\xc0", CMOVcc32rr, FE_CC_NP, FE_AX, FE_AX); -TEST("\x0f\x4b\x00", CMOVNP32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4b\x00", CMOVcc32rm, FE_CC_NP, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4b\x00", CMOVNP32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4b\x00", CMOVcc32rm, FE_CC_NP|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xeb\x08", CMPNPXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xeb\x08", CMPccXADD32mrr, FE_CC_NP, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xeb\x08", CMPNPXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xeb\x08", CMPccXADD64mrr, FE_CC_NP, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7c\x00", JL, 0, FE_PTR(2)); -TEST("\x7c\x00", Jcc, FE_CC_L, FE_PTR(2)); -TEST("\x0f\x8c\x00\x00\x00\x00", JL, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8c\x00\x00\x00\x00", Jcc, FE_CC_L|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8c\x7c\x00\x00\x00", JL, 0, FE_PTR(130)); -TEST("\x0f\x8c\x7c\x00\x00\x00", Jcc, FE_CC_L, FE_PTR(130)); -TEST("\x0f\x9c\xc0", SETL8r, 0, FE_AX); -TEST("\x0f\x9c\xc0", SETcc8r, FE_CC_L, FE_AX); -TEST("\x0f\x9c\x00", SETL8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9c\x00", SETcc8m, FE_CC_L, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9c\x00", SETL8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9c\x00", SETcc8m, FE_CC_L|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4c\xc0", CMOVL32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4c\xc0", CMOVcc32rr, FE_CC_L, FE_AX, FE_AX); -TEST("\x0f\x4c\x00", CMOVL32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4c\x00", CMOVcc32rm, FE_CC_L, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4c\x00", CMOVL32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4c\x00", CMOVcc32rm, FE_CC_L|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xec\x08", CMPLXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xec\x08", CMPccXADD32mrr, FE_CC_L, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xec\x08", CMPLXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xec\x08", CMPccXADD64mrr, FE_CC_L, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7d\x00", JGE, 0, FE_PTR(2)); -TEST("\x7d\x00", Jcc, FE_CC_GE, FE_PTR(2)); -TEST("\x0f\x8d\x00\x00\x00\x00", JGE, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8d\x00\x00\x00\x00", Jcc, FE_CC_GE|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8d\x7c\x00\x00\x00", JGE, 0, FE_PTR(130)); -TEST("\x0f\x8d\x7c\x00\x00\x00", Jcc, FE_CC_GE, FE_PTR(130)); -TEST("\x0f\x9d\xc0", SETGE8r, 0, FE_AX); -TEST("\x0f\x9d\xc0", SETcc8r, FE_CC_GE, FE_AX); -TEST("\x0f\x9d\x00", SETGE8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9d\x00", SETcc8m, FE_CC_GE, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9d\x00", SETGE8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9d\x00", SETcc8m, FE_CC_GE|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4d\xc0", CMOVGE32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4d\xc0", CMOVcc32rr, FE_CC_GE, FE_AX, FE_AX); -TEST("\x0f\x4d\x00", CMOVGE32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4d\x00", CMOVcc32rm, FE_CC_GE, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4d\x00", CMOVGE32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4d\x00", CMOVcc32rm, FE_CC_GE|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xed\x08", CMPNLXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xed\x08", CMPccXADD32mrr, FE_CC_NL, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xed\x08", CMPNLXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xed\x08", CMPccXADD64mrr, FE_CC_NL, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7e\x00", JLE, 0, FE_PTR(2)); -TEST("\x7e\x00", Jcc, FE_CC_LE, FE_PTR(2)); -TEST("\x0f\x8e\x00\x00\x00\x00", JLE, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8e\x00\x00\x00\x00", Jcc, FE_CC_LE|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8e\x7c\x00\x00\x00", JLE, 0, FE_PTR(130)); -TEST("\x0f\x8e\x7c\x00\x00\x00", Jcc, FE_CC_LE, FE_PTR(130)); -TEST("\x0f\x9e\xc0", SETLE8r, 0, FE_AX); -TEST("\x0f\x9e\xc0", SETcc8r, FE_CC_LE, FE_AX); -TEST("\x0f\x9e\x00", SETLE8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9e\x00", SETcc8m, FE_CC_LE, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9e\x00", SETLE8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9e\x00", SETcc8m, FE_CC_LE|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4e\xc0", CMOVLE32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4e\xc0", CMOVcc32rr, FE_CC_LE, FE_AX, FE_AX); -TEST("\x0f\x4e\x00", CMOVLE32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4e\x00", CMOVcc32rm, FE_CC_LE, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4e\x00", CMOVLE32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4e\x00", CMOVcc32rm, FE_CC_LE|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xee\x08", CMPLEXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xee\x08", CMPccXADD32mrr, FE_CC_LE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xee\x08", CMPLEXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xee\x08", CMPccXADD64mrr, FE_CC_LE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -TEST("\x7f\x00", JG, 0, FE_PTR(2)); -TEST("\x7f\x00", Jcc, FE_CC_G, FE_PTR(2)); -TEST("\x0f\x8f\x00\x00\x00\x00", JG, FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8f\x00\x00\x00\x00", Jcc, FE_CC_G|FE_JMPL, FE_PTR(6)); -TEST("\x0f\x8f\x7c\x00\x00\x00", JG, 0, FE_PTR(130)); -TEST("\x0f\x8f\x7c\x00\x00\x00", Jcc, FE_CC_G, FE_PTR(130)); -TEST("\x0f\x9f\xc0", SETG8r, 0, FE_AX); -TEST("\x0f\x9f\xc0", SETcc8r, FE_CC_G, FE_AX); -TEST("\x0f\x9f\x00", SETG8m, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x9f\x00", SETcc8m, FE_CC_G, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9f\x00", SETG8m, FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x9f\x00", SETcc8m, FE_CC_G|FE_ADDR32, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4f\xc0", CMOVG32rr, 0, FE_AX, FE_AX); -TEST("\x0f\x4f\xc0", CMOVcc32rr, FE_CC_G, FE_AX, FE_AX); -TEST("\x0f\x4f\x00", CMOVG32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x0f\x4f\x00", CMOVcc32rm, FE_CC_G, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4f\x00", CMOVG32rm, FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x67\x0f\x4f\x00", CMOVcc32rm, FE_CC_G|FE_ADDR32, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x61\xef\x08", CMPNLEXADD32mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\x61\xef\x08", CMPccXADD32mrr, FE_CC_NLE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xef\x08", CMPNLEXADD64mrr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); -TEST("\xc4\xe2\xe1\xef\x08", CMPccXADD64mrr, FE_CC_NLE, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX, FE_BX); - -// Test FD/TD encodings -TEST("\xa0\x00\x00\x00\x00\x00\x00\x00\x00", MOV8ra, 0, FE_AX, 0); -TEST("\x67\xa0\x00\x00\x00\x00", MOV8ra, FE_ADDR32, FE_AX, 0); -TEST("\x66\xa1\x00\x00\x00\x00\x00\x00\x00\x00", MOV16ra, 0, FE_AX, 0); -TEST("\x67\x66\xa1\x00\x00\x00\x00", MOV16ra, FE_ADDR32, FE_AX, 0); -TEST("\x66\xa1\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV16ra, 0, FE_AX, 0xfedcba9876543210); -TEST("\x67\x66\xa1\x98\xba\xdc\xfe", MOV16ra, FE_ADDR32, FE_AX, 0xfedcba98); -TEST("\xa1\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV32ra, 0, FE_AX, 0xfedcba9876543210); -TEST("\x67\xa1\x98\xba\xdc\xfe", MOV32ra, FE_ADDR32, FE_AX, 0xfedcba98); -TEST("\x48\xa1\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV64ra, 0, FE_AX, 0xfedcba9876543210); -TEST("\x67\x48\xa1\x98\xba\xdc\xfe", MOV64ra, FE_ADDR32, FE_AX, 0xfedcba98); -TEST("\xa2\x00\x00\x00\x00\x00\x00\x00\x00", MOV8ar, 0, 0, FE_AX); -TEST("\x67\xa2\x00\x00\x00\x00", MOV8ar, FE_ADDR32, 0, FE_AX); -TEST("\x66\xa3\x00\x00\x00\x00\x00\x00\x00\x00", MOV16ar, 0, 0, FE_AX); -TEST("\x67\x66\xa3\x00\x00\x00\x00", MOV16ar, FE_ADDR32, 0, FE_AX); -TEST("\x66\xa3\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV16ar, 0, 0xfedcba9876543210, FE_AX); -TEST("\x67\x66\xa3\x98\xba\xdc\xfe", MOV16ar, FE_ADDR32, 0xfedcba98, FE_AX); -TEST("\xa3\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV32ar, 0, 0xfedcba9876543210, FE_AX); -TEST("\x67\xa3\x98\xba\xdc\xfe", MOV32ar, FE_ADDR32, 0xfedcba98, FE_AX); -TEST("\x48\xa3\x10\x32\x54\x76\x98\xba\xdc\xfe", MOV64ar, 0, 0xfedcba9876543210, FE_AX); -TEST("\x67\x48\xa3\x98\xba\xdc\xfe", MOV64ar, FE_ADDR32, 0xfedcba98, FE_AX); -TEST("", MOV8ra, 0, FE_CX, 0); -TEST("", MOV8ra, FE_ADDR32, FE_CX, 0); -TEST("", MOV16ra, 0, FE_CX, 0); -TEST("", MOV16ra, FE_ADDR32, FE_CX, 0); -TEST("", MOV16ra, 0, FE_CX, 0xfedcba9876543210); -TEST("", MOV16ra, FE_ADDR32, FE_CX, 0xfedcba98); -TEST("", MOV32ra, 0, FE_CX, 0xfedcba9876543210); -TEST("", MOV32ra, FE_ADDR32, FE_CX, 0xfedcba98); -TEST("", MOV64ra, 0, FE_CX, 0xfedcba9876543210); -TEST("", MOV64ra, FE_ADDR32, FE_CX, 0xfedcba98); -TEST("", MOV8ar, 0, 0, FE_CX); -TEST("", MOV8ar, FE_ADDR32, 0, FE_CX); -TEST("", MOV16ar, 0, 0, FE_CX); -TEST("", MOV16ar, FE_ADDR32, 0, FE_CX); -TEST("", MOV16ar, 0, 0xfedcba9876543210, FE_CX); -TEST("", MOV16ar, FE_ADDR32, 0xfedcba98, FE_CX); -TEST("", MOV32ar, 0, 0xfedcba9876543210, FE_CX); -TEST("", MOV32ar, FE_ADDR32, 0xfedcba98, FE_CX); -TEST("", MOV64ar, 0, 0xfedcba9876543210, FE_CX); -TEST("", MOV64ar, FE_ADDR32, 0xfedcba98, FE_CX); - -TEST("\xc7\xf8\x02\x00\x00\x00", XBEGIN, 0, FE_PTR(8)); - -// BMI1 -TEST("\xf3\x0f\xbc\xc2", TZCNT32rr, 0, FE_AX, FE_DX); -TEST("\x66\xf3\x0f\xbc\xc2", TZCNT16rr, 0, FE_AX, FE_DX); -TEST("\xf3\x48\x0f\xbc\xc2", TZCNT64rr, 0, FE_AX, FE_DX); -TEST("\xf3\x0f\xbd\xc2", LZCNT32rr, 0, FE_AX, FE_DX); -TEST("\x66\xf3\x0f\xbd\xc2", LZCNT16rr, 0, FE_AX, FE_DX); -TEST("\xf3\x48\x0f\xbd\xc2", LZCNT64rr, 0, FE_AX, FE_DX); -TEST("\xc4\xc2\x18\xf2\xc7", ANDN32rrr, 0, FE_AX, FE_R12, FE_R15); -TEST("\xc4\xc2\x98\xf2\xc7", ANDN64rrr, 0, FE_AX, FE_R12, FE_R15); -TEST("\xc4\x42\x18\xf2\xc7", ANDN32rrr, 0, FE_R8, FE_R12, FE_R15); -TEST("\xc4\x42\x98\xf2\xc7", ANDN64rrr, 0, FE_R8, FE_R12, FE_R15); -TEST("\xc4\xe2\x78\xf3\xca", BLSR32rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\x78\xf3\x08", BLSR32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf8\xf3\xca", BLSR64rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\xf8\xf3\x08", BLSR64rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xc2\x38\xf3\xc9", BLSR32rr, 0, FE_R8, FE_R9); -TEST("\xc4\xc2\xb8\xf3\xc9", BLSR64rr, 0, FE_R8, FE_R9); -TEST("\xc4\xe2\x38\xf3\xc9", BLSR32rr, 0, FE_R8, FE_CX); -TEST("\xc4\xe2\xb8\xf3\xc9", BLSR64rr, 0, FE_R8, FE_CX); -TEST("\xc4\xc2\x78\xf3\xc9", BLSR32rr, 0, FE_AX, FE_R9); -TEST("\xc4\xc2\xf8\xf3\xc9", BLSR64rr, 0, FE_AX, FE_R9); -TEST("\xc4\xe2\x78\xf3\xd2", BLSMSK32rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\x78\xf3\x10", BLSMSK32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf8\xf3\xd2", BLSMSK64rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\xf8\xf3\x10", BLSMSK64rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x78\xf3\xda", BLSI32rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\x78\xf3\x18", BLSI32rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf8\xf3\xda", BLSI64rr, 0, FE_AX, FE_DX); -TEST("\xc4\xe2\xf8\xf3\x18", BLSI64rm, 0, FE_AX, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xc2\x18\xf7\xc7", BEXTR32rrr, 0, FE_AX, FE_R15, FE_R12); -TEST("\xc4\xc2\x98\xf7\xc7", BEXTR64rrr, 0, FE_AX, FE_R15, FE_R12); -TEST("\xc4\x42\x18\xf7\xc7", BEXTR32rrr, 0, FE_R8, FE_R15, FE_R12); -TEST("\xc4\x42\x98\xf7\xc7", BEXTR64rrr, 0, FE_R8, FE_R15, FE_R12); - -TEST("\x0f\x30", WRMSR, 0); -TEST("\x0f\x32", RDMSR, 0); -TEST("\x0f\x01\xc6", WRMSRNS, 0); -TEST("\xf2\x0f\x01\xc6", RDMSRLIST, 0); -TEST("\xf3\x0f\x01\xc6", WRMSRLIST, 0); -TEST("\xc4\xe7\x7b\xf6\xc1\x10\x20\x30\x40", RDMSRri, 0, FE_CX, 0x40302010); -TEST("\xc4\xe7\x7a\xf6\xc1\x10\x20\x30\x40", WRMSRNSir, 0, 0x40302010, FE_CX); -TEST("\xf2\x0f\x38\xf8\xc1", URDMSRrr, 0, FE_CX, FE_AX); -TEST("\xf3\x0f\x38\xf8\xc1", UWRMSRrr, 0, FE_CX, FE_AX); -TEST("\xc4\xe7\x7b\xf8\xc1\x10\x20\x30\x40", URDMSRri, 0, FE_CX, 0x40302010); -TEST("\xc4\xe7\x7a\xf8\xc1\x10\x20\x30\x40", UWRMSRir, 0, 0x40302010, FE_CX); - -TEST("\x0f\x38\xfc\x01", AADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x48\x0f\x38\xfc\x01", AADD64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x66\x0f\x38\xfc\x01", AAND32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x66\x48\x0f\x38\xfc\x01", AAND64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\xf3\x0f\x38\xfc\x01", AXOR32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\xf3\x48\x0f\x38\xfc\x01", AXOR64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\xf2\x0f\x38\xfc\x01", AOR32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\xf2\x48\x0f\x38\xfc\x01", AOR64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); - -// Test FPU instructions -TEST("\xd8\x00", FADDm32, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdc\x00", FADDm64, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xd8\xc0", FADDrr, 0, FE_ST0, FE_ST0); -TEST("\xd8\xc1", FADDrr, 0, FE_ST0, FE_ST1); -TEST("\xdc\xc1", FADDrr, 0, FE_ST1, FE_ST0); -TEST("", FADDrr, 0, FE_ST1, FE_ST1); -TEST("\xde\xc1", FADDPrr, 0, FE_ST1, FE_ST0); -TEST("\xda\x00", FIADDm32, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xde\x00", FIADDm16, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xd9\x00", FLDm32, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdd\x00", FLDm64, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdb\x28", FLDm80, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdf\x00", FILDm16, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdb\x00", FILDm32, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xdf\x28", FILDm64, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xd9\xc1", FLDr, 0, FE_ST1); -TEST("\xd9\xe8", FLD1, 0); -TEST("\xdf\xe0", FSTSWr, 0, FE_AX); -TEST("", FSTSWr, 0, FE_CX); - -// Test VEX encoding -TEST("\xc5\xfc\x77", VZEROALL, 0); -TEST("\xc5\xf8\x77", VZEROUPPER, 0); -TEST("\xc5\xf2\x58\xc2", VADDSSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc5\xf0\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc5\xf4\x58\xc2", VADDPS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xc1\x74\x58\xc0", VADDPS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM8); -TEST("\xc4\x62\x7d\x19\xc2", VBROADCASTSD256rr, 0, FE_XMM8, FE_XMM2); -TEST("\xc4\x62\x7d\x1a\xc2", VBROADCASTF128_256rr, 0, FE_XMM8, FE_XMM2); -TEST("\xc4\xe2\x71\x9d\xc2", VFNMADD132SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9d\xc2", VFNMADD132SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x2e\x17", VMASKMOVPS128mrr, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0), FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x2e\x17", VMASKMOVPS256mrr, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0), FE_XMM1, FE_XMM2); -TEST("\xc5\xf1\x71\xd7\x02", VPSRLW128rri, 0, FE_XMM1, FE_XMM7, 0x2); -TEST("\xc5\xf5\x71\xd7\x02", VPSRLW256rri, 0, FE_XMM1, FE_XMM7, 0x2); -TEST("\xc4\xc3\xfd\x00\xc9\x12", VPERMQ256rri, 0, FE_XMM1, FE_XMM9, 0x12); -TEST("\xc4\xe3\xfd\x01\xcf\x12", VPERMPD256rri, 0, FE_XMM1, FE_XMM7, 0x12); -TEST("\xc5\xf9\xc5\xc0\x00", VPEXTRWrri, 0, FE_AX, FE_XMM0, 0x0); -// VMASKMOVDQU is the only VEX instruction which supports addrsize/segment -// overrides without a memory operand. -TEST("\xc5\xf9\xf7\xc1", VMASKMOVDQU128rr, 0, FE_XMM0, FE_XMM1); -TEST("\x64\xc5\xf9\xf7\xc1", VMASKMOVDQU128rr, FE_SEG(FE_FS), FE_XMM0, FE_XMM1); -TEST("\x67\xc5\xf9\xf7\xc1", VMASKMOVDQU128rr, FE_ADDR32, FE_XMM0, FE_XMM1); -TEST("\x64\x67\xc5\xf9\xf7\xc1", VMASKMOVDQU128rr, FE_ADDR32|FE_SEG(FE_FS), FE_XMM0, FE_XMM1); - -// Test VEX.RXBv -TEST("\xc5\xf4\x58\xc2", VADDPS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc5\x74\x58\xc2", VADDPS256rrr, 0, FE_XMM8, FE_XMM1, FE_XMM2); -TEST("\xc5\xb4\x58\xc2", VADDPS256rrr, 0, FE_XMM0, FE_XMM9, FE_XMM2); -TEST("\xc5\x34\x58\xc2", VADDPS256rrr, 0, FE_XMM8, FE_XMM9, FE_XMM2); -TEST("\xc4\xc1\x74\x58\xc2", VADDPS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM10); -TEST("\xc4\x41\x74\x58\xc2", VADDPS256rrr, 0, FE_XMM8, FE_XMM1, FE_XMM10); -TEST("\xc4\xc1\x34\x58\xc2", VADDPS256rrr, 0, FE_XMM0, FE_XMM9, FE_XMM10); -TEST("\xc4\x41\x34\x58\xc2", VADDPS256rrr, 0, FE_XMM8, FE_XMM9, FE_XMM10); - -TEST("\xc5\xf4\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0)); -TEST("\xc5\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0)); -TEST("\xc4\xa1\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0)); -TEST("\xc4\x21\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0)); -TEST("\xc5\xb4\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0)); -TEST("\xc5\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0)); -TEST("\xc4\xa1\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0)); -TEST("\xc4\x21\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0)); -TEST("\xc4\xc1\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0)); -TEST("\xc4\x41\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0)); -TEST("\xc4\x81\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0)); -TEST("\xc4\x01\x74\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0)); -TEST("\xc4\xc1\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0)); -TEST("\xc4\x41\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0)); -TEST("\xc4\x81\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0)); -TEST("\xc4\x01\x34\x58\x04\x1a", VADDPS256rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0)); - -// Test RVMR encoding -TEST("\xc4\xe3\x71\x4a\xc2\x30", VBLENDVPS128rrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2, FE_XMM3); -TEST("\xc4\xe3\x75\x4a\xc2\x30", VBLENDVPS256rrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2, FE_XMM3); -TEST("\xc4\xe3\x71\x4a\x05\x00\x00\x00\x00\x20", VBLENDVPS128rrmr, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_IP, 0, FE_NOREG, 10), FE_XMM2); -TEST("\xc4\xe3\x75\x4a\x05\x00\x00\x00\x00\x20", VBLENDVPS256rrmr, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_IP, 0, FE_NOREG, 10), FE_XMM2); - -// Make sure that high registers fail with VEX-only instructions -TEST("", VBLENDVPS128rrrr, 0, FE_XMM16, FE_XMM1, FE_XMM2, FE_XMM3); -TEST("", VBLENDVPS128rrrr, 0, FE_XMM0, FE_XMM17, FE_XMM2, FE_XMM3); -TEST("", VBLENDVPS128rrrr, 0, FE_XMM0, FE_XMM1, FE_XMM18, FE_XMM3); -TEST("", VBLENDVPS128rrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2, FE_XMM19); -TEST("", VGATHERDPS128rmr, 0, FE_XMM16, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM17, 0), FE_XMM1); -TEST("", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM18); - -TEST("\xc4\xe2\x71\x96\xc2", VFMADDSUB132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x96\x06", VFMADDSUB132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x96\xc2", VFMADDSUB132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x96\x06", VFMADDSUB132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x96\xc2", VFMADDSUB132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x96\x06", VFMADDSUB132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x96\xc2", VFMADDSUB132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x96\x06", VFMADDSUB132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x97\xc2", VFMSUBADD132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x97\x06", VFMSUBADD132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x97\xc2", VFMSUBADD132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x97\x06", VFMSUBADD132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x97\xc2", VFMSUBADD132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x97\x06", VFMSUBADD132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x97\xc2", VFMSUBADD132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x97\x06", VFMSUBADD132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x98\xc2", VFMADD132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x98\x06", VFMADD132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x98\xc2", VFMADD132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x98\x06", VFMADD132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x98\xc2", VFMADD132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x98\x06", VFMADD132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x98\xc2", VFMADD132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x98\x06", VFMADD132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x99\xc2", VFMADD132SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x99\x06", VFMADD132SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x99\xc2", VFMADD132SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x99\x06", VFMADD132SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9a\xc2", VFMSUB132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9a\x06", VFMSUB132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x9a\xc2", VFMSUB132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x9a\x06", VFMSUB132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9a\xc2", VFMSUB132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9a\x06", VFMSUB132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x9a\xc2", VFMSUB132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x9a\x06", VFMSUB132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9b\xc2", VFMSUB132SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9b\x06", VFMSUB132SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9b\xc2", VFMSUB132SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9b\x06", VFMSUB132SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9c\xc2", VFNMADD132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9c\x06", VFNMADD132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x9c\xc2", VFNMADD132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x9c\x06", VFNMADD132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9c\xc2", VFNMADD132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9c\x06", VFNMADD132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x9c\xc2", VFNMADD132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x9c\x06", VFNMADD132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9d\xc2", VFNMADD132SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9d\x06", VFNMADD132SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9d\xc2", VFNMADD132SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9d\x06", VFNMADD132SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9e\xc2", VFNMSUB132PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9e\x06", VFNMSUB132PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\x9e\xc2", VFNMSUB132PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x9e\x06", VFNMSUB132PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9e\xc2", VFNMSUB132PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9e\x06", VFNMSUB132PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\x9e\xc2", VFNMSUB132PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\x9e\x06", VFNMSUB132PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\x9f\xc2", VFNMSUB132SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x9f\x06", VFNMSUB132SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\x9f\xc2", VFNMSUB132SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\x9f\x06", VFNMSUB132SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xa6\xc2", VFMADDSUB213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xa6\x06", VFMADDSUB213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xa6\xc2", VFMADDSUB213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xa6\x06", VFMADDSUB213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xa6\xc2", VFMADDSUB213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xa6\x06", VFMADDSUB213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xa6\xc2", VFMADDSUB213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xa6\x06", VFMADDSUB213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xa7\xc2", VFMSUBADD213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xa7\x06", VFMSUBADD213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xa7\xc2", VFMSUBADD213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xa7\x06", VFMSUBADD213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xa7\xc2", VFMSUBADD213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xa7\x06", VFMSUBADD213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xa7\xc2", VFMSUBADD213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xa7\x06", VFMSUBADD213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xa8\xc2", VFMADD213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xa8\x06", VFMADD213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xa8\xc2", VFMADD213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xa8\x06", VFMADD213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xa8\xc2", VFMADD213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xa8\x06", VFMADD213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xa8\xc2", VFMADD213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xa8\x06", VFMADD213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xa9\xc2", VFMADD213SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xa9\x06", VFMADD213SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xa9\xc2", VFMADD213SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xa9\x06", VFMADD213SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xaa\xc2", VFMSUB213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xaa\x06", VFMSUB213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xaa\xc2", VFMSUB213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xaa\x06", VFMSUB213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xaa\xc2", VFMSUB213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xaa\x06", VFMSUB213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xaa\xc2", VFMSUB213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xaa\x06", VFMSUB213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xab\xc2", VFMSUB213SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xab\x06", VFMSUB213SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xab\xc2", VFMSUB213SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xab\x06", VFMSUB213SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xac\xc2", VFNMADD213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xac\x06", VFNMADD213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xac\xc2", VFNMADD213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xac\x06", VFNMADD213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xac\xc2", VFNMADD213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xac\x06", VFNMADD213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xac\xc2", VFNMADD213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xac\x06", VFNMADD213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xad\xc2", VFNMADD213SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xad\x06", VFNMADD213SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xad\xc2", VFNMADD213SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xad\x06", VFNMADD213SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xae\xc2", VFNMSUB213PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xae\x06", VFNMSUB213PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xae\xc2", VFNMSUB213PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xae\x06", VFNMSUB213PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xae\xc2", VFNMSUB213PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xae\x06", VFNMSUB213PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xae\xc2", VFNMSUB213PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xae\x06", VFNMSUB213PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xaf\xc2", VFNMSUB213SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xaf\x06", VFNMSUB213SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xaf\xc2", VFNMSUB213SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xaf\x06", VFNMSUB213SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xb6\xc2", VFMADDSUB231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xb6\x06", VFMADDSUB231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xb6\xc2", VFMADDSUB231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xb6\x06", VFMADDSUB231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xb6\xc2", VFMADDSUB231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xb6\x06", VFMADDSUB231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xb6\xc2", VFMADDSUB231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xb6\x06", VFMADDSUB231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xb7\xc2", VFMSUBADD231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xb7\x06", VFMSUBADD231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xb7\xc2", VFMSUBADD231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xb7\x06", VFMSUBADD231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xb7\xc2", VFMSUBADD231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xb7\x06", VFMSUBADD231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xb7\xc2", VFMSUBADD231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xb7\x06", VFMSUBADD231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xb8\xc2", VFMADD231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xb8\x06", VFMADD231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xb8\xc2", VFMADD231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xb8\x06", VFMADD231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xb8\xc2", VFMADD231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xb8\x06", VFMADD231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xb8\xc2", VFMADD231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xb8\x06", VFMADD231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xb9\xc2", VFMADD231SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xb9\x06", VFMADD231SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xb9\xc2", VFMADD231SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xb9\x06", VFMADD231SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xba\xc2", VFMSUB231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xba\x06", VFMSUB231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xba\xc2", VFMSUB231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xba\x06", VFMSUB231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xba\xc2", VFMSUB231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xba\x06", VFMSUB231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xba\xc2", VFMSUB231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xba\x06", VFMSUB231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xbb\xc2", VFMSUB231SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xbb\x06", VFMSUB231SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xbb\xc2", VFMSUB231SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xbb\x06", VFMSUB231SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xbc\xc2", VFNMADD231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xbc\x06", VFNMADD231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xbc\xc2", VFNMADD231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xbc\x06", VFNMADD231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xbc\xc2", VFNMADD231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xbc\x06", VFNMADD231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xbc\xc2", VFNMADD231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xbc\x06", VFNMADD231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xbd\xc2", VFNMADD231SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xbd\x06", VFNMADD231SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xbd\xc2", VFNMADD231SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xbd\x06", VFNMADD231SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xbe\xc2", VFNMSUB231PS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xbe\x06", VFNMSUB231PS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x75\xbe\xc2", VFNMSUB231PS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xbe\x06", VFNMSUB231PS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xbe\xc2", VFNMSUB231PD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xbe\x06", VFNMSUB231PD128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf5\xbe\xc2", VFNMSUB231PD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xbe\x06", VFNMSUB231PD256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x71\xbf\xc2", VFNMSUB231SSrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xbf\x06", VFNMSUB231SSrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\xf1\xbf\xc2", VFNMSUB231SDrrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xbf\x06", VFNMSUB231SDrrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_SI, 0, FE_NOREG, 0)); - -// VSIB encodings -#ifndef ENC_TEST_TYPESAFE -TEST("", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEM(FE_DI, 8, FE_NOREG, 0), FE_XMM1); // must have SIB -TEST("", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0), FE_XMM1); // must have SIB -TEST("", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEM(FE_DI, 0, FE_AX, 0), FE_XMM1); // must have XMM index -#endif -TEST("\xc4\xe2\x71\x92\x04\xff", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x92\x04\xe7", VGATHERDPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x92\x04\xff", VGATHERDPS256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x92\x04\xe7", VGATHERDPS256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x93\x04\xff", VGATHERQPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x93\x04\xe7", VGATHERQPS128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x93\x04\xff", VGATHERQPS256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x93\x04\xe7", VGATHERQPS256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x92\x04\xff", VGATHERDPD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x92\x04\xe7", VGATHERDPD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x92\x04\xff", VGATHERDPD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x92\x04\xe7", VGATHERDPD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x93\x04\xff", VGATHERQPD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x93\x04\xe7", VGATHERQPD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x93\x04\xff", VGATHERQPD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x93\x04\xe7", VGATHERQPD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x90\x04\xff", VPGATHERDD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x90\x04\xe7", VPGATHERDD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x90\x04\xff", VPGATHERDD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x90\x04\xe7", VPGATHERDD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x91\x04\xff", VPGATHERQD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x71\x91\x04\xe7", VPGATHERQD128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x91\x04\xff", VPGATHERQD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\x75\x91\x04\xe7", VPGATHERQD256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x90\x04\xff", VPGATHERDQ128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x90\x04\xe7", VPGATHERDQ128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x90\x04\xff", VPGATHERDQ256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x90\x04\xe7", VPGATHERDQ256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x91\x04\xff", VPGATHERQQ128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf1\x91\x04\xe7", VPGATHERQQ128rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x91\x04\xff", VPGATHERQQ256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM7, 0), FE_XMM1); -TEST("\xc4\xe2\xf5\x91\x04\xe7", VPGATHERQQ256rmr, 0, FE_XMM0, FE_MEMV(FE_DI, 8, FE_XMM4, 0), FE_XMM1); - -TEST("\xc4\xe2\x79\xdb\xc1", VAESIMCrr, 0, FE_XMM0, FE_XMM1); -TEST("\xc4\xe3\x79\xdf\xc1\xae", VAESKEYGENASSISTrri, 0, FE_XMM0, FE_XMM1, (int8_t) 0xae); -TEST("\xc4\xe2\x71\xdc\xc2", VAESENC128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xdc\xc2", VAESENC256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xdd\xc2", VAESENCLAST128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xdd\xc2", VAESENCLAST256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xde\xc2", VAESDEC128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xde\xc2", VAESDEC256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\xdf\xc2", VAESDECLAST128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\xdf\xc2", VAESDECLAST256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); - -TEST("\xc4\xe2\x70\x50\xc2", VPDPBUUD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x74\x50\xc2", VPDPBUUD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x50\xc2", VPDPBUSD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x50\xc2", VPDPBUSD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x72\x50\xc2", VPDPBSUD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x76\x50\xc2", VPDPBSUD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x73\x50\xc2", VPDPBSSD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x77\x50\xc2", VPDPBSSD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x70\x51\xc2", VPDPBUUDS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x74\x51\xc2", VPDPBUUDS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x51\xc2", VPDPBUSDS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x51\xc2", VPDPBUSDS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x72\x51\xc2", VPDPBSUDS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x76\x51\xc2", VPDPBSUDS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x73\x51\xc2", VPDPBSSDS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x77\x51\xc2", VPDPBSSDS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x52\xc2", VPDPWSSD128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x52\xc2", VPDPWSSD256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x71\x53\xc2", VPDPWSSDS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\x75\x53\xc2", VPDPWSSDS256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); - -TEST("\xc4\xe2\x78\xb0\x08", VCVTNEOPH2PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7c\xb0\x08", VCVTNEOPH2PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x79\xb0\x08", VCVTNEEPH2PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7d\xb0\x08", VCVTNEEPH2PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7a\xb0\x08", VCVTNEEBF162PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7e\xb0\x08", VCVTNEEBF162PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7b\xb0\x08", VCVTNEOBF162PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7f\xb0\x08", VCVTNEOBF162PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x79\xb1\x08", VBCSTNESH2PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7d\xb1\x08", VBCSTNESH2PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7a\xb1\x08", VBCSTNEBF162PS128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7e\xb1\x08", VBCSTNEBF162PS256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x7a\x72\xc1", VCVTNEPS2BF16_128rr, 0, FE_XMM0, FE_XMM1); -TEST("\xc4\xe2\x7e\x72\xc1", VCVTNEPS2BF16_256rr, 0, FE_XMM0, FE_XMM1); - -TEST("\xc4\xe2\xf1\xb4\xc2", VPMADD52LUQ128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xb4\xc2", VPMADD52LUQ256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf1\xb5\xc2", VPMADD52HUQ128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc4\xe2\xf5\xb5\xc2", VPMADD52HUQ256rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); - -// AVX-512 -// NB: VEX instructions are here to test automatic downgrading from EVEX to VEX. - -// EVEX functionality; VEX-downgrade occasionally prevented with mask -// Part 1: register extension bits for rrr/rri -TEST("\xc5\xf0\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x09\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\xc5\x70\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM1, FE_XMM2); -TEST("\x62\x71\x74\x09\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM1, FE_XMM2); -TEST("\x62\xe1\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM1, FE_XMM2); -TEST("\x62\x61\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM1, FE_XMM2); -TEST("\xc5\xb0\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM9, FE_XMM2); -TEST("\x62\xf1\x34\x09\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM9, FE_XMM2); -TEST("\xc5\x30\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM9, FE_XMM2); -TEST("\x62\x71\x34\x09\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM9, FE_XMM2); -TEST("\x62\xe1\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM9, FE_XMM2); -TEST("\x62\x61\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM9, FE_XMM2); -TEST("\x62\xf1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM17, FE_XMM2); -TEST("\x62\x71\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM17, FE_XMM2); -TEST("\x62\xe1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM17, FE_XMM2); -TEST("\x62\x61\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM17, FE_XMM2); -TEST("\x62\xf1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM25, FE_XMM2); -TEST("\x62\x71\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM25, FE_XMM2); -TEST("\x62\xe1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM25, FE_XMM2); -TEST("\x62\x61\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM25, FE_XMM2); -TEST("\xc4\xc1\x70\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM10); -TEST("\xc4\x41\x70\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM1, FE_XMM10); -TEST("\x62\xc1\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM1, FE_XMM10); -TEST("\x62\x41\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM1, FE_XMM10); -TEST("\xc4\xc1\x30\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM9, FE_XMM10); -TEST("\xc4\x41\x30\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM9, FE_XMM10); -TEST("\x62\xc1\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM9, FE_XMM10); -TEST("\x62\x41\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM9, FE_XMM10); -TEST("\x62\xd1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM17, FE_XMM10); -TEST("\x62\x51\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM17, FE_XMM10); -TEST("\x62\xc1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM17, FE_XMM10); -TEST("\x62\x41\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM17, FE_XMM10); -TEST("\x62\xd1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM25, FE_XMM10); -TEST("\x62\x51\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM25, FE_XMM10); -TEST("\x62\xc1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM25, FE_XMM10); -TEST("\x62\x41\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM25, FE_XMM10); -TEST("\x62\xb1\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM18); -TEST("\x62\x31\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM1, FE_XMM18); -TEST("\x62\xa1\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM1, FE_XMM18); -TEST("\x62\x21\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM1, FE_XMM18); -TEST("\x62\xb1\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM9, FE_XMM18); -TEST("\x62\x31\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM9, FE_XMM18); -TEST("\x62\xa1\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM9, FE_XMM18); -TEST("\x62\x21\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM9, FE_XMM18); -TEST("\x62\xb1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM17, FE_XMM18); -TEST("\x62\x31\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM17, FE_XMM18); -TEST("\x62\xa1\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM17, FE_XMM18); -TEST("\x62\x21\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM17, FE_XMM18); -TEST("\x62\xb1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM25, FE_XMM18); -TEST("\x62\x31\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM25, FE_XMM18); -TEST("\x62\xa1\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM25, FE_XMM18); -TEST("\x62\x21\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM25, FE_XMM18); -TEST("\x62\x91\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM1, FE_XMM26); -TEST("\x62\x11\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM1, FE_XMM26); -TEST("\x62\x81\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM1, FE_XMM26); -TEST("\x62\x01\x74\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM1, FE_XMM26); -TEST("\x62\x91\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM9, FE_XMM26); -TEST("\x62\x11\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM9, FE_XMM26); -TEST("\x62\x81\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM9, FE_XMM26); -TEST("\x62\x01\x34\x08\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM9, FE_XMM26); -TEST("\x62\x91\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM17, FE_XMM26); -TEST("\x62\x11\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM17, FE_XMM26); -TEST("\x62\x81\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM17, FE_XMM26); -TEST("\x62\x01\x74\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM17, FE_XMM26); -TEST("\x62\x91\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM0, FE_XMM25, FE_XMM26); -TEST("\x62\x11\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM8, FE_XMM25, FE_XMM26); -TEST("\x62\x81\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM16, FE_XMM25, FE_XMM26); -TEST("\x62\x01\x34\x00\x58\xc2", VADDPS128rrr, 0, FE_XMM24, FE_XMM25, FE_XMM26); -TEST("\xc5\xf9\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM0, FE_XMM1, 1); -TEST("\xc5\xb9\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM8, FE_XMM1, 1); -TEST("\x62\xf1\x7d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM16, FE_XMM1, 1); -TEST("\x62\xf1\x3d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM24, FE_XMM1, 1); -TEST("\xc4\xc1\x79\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM0, FE_XMM9, 1); -TEST("\xc4\xc1\x39\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM8, FE_XMM9, 1); -TEST("\x62\xd1\x7d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM16, FE_XMM9, 1); -TEST("\x62\xd1\x3d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM24, FE_XMM9, 1); -TEST("\x62\xb1\x7d\x08\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM0, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x08\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM8, FE_XMM17, 1); -TEST("\x62\xb1\x7d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM16, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM24, FE_XMM17, 1); -TEST("\x62\x91\x7d\x08\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM0, FE_XMM25, 1); -TEST("\x62\x91\x3d\x08\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM8, FE_XMM25, 1); -TEST("\x62\x91\x7d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM16, FE_XMM25, 1); -TEST("\x62\x91\x3d\x00\x71\xd1\x01", VPSRLW128rri, 0, FE_XMM24, FE_XMM25, 1); -TEST("\xc5\xfd\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM0, FE_XMM1, 1); -TEST("\xc5\xbd\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM8, FE_XMM1, 1); -TEST("\x62\xf1\x7d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM16, FE_XMM1, 1); -TEST("\x62\xf1\x3d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM24, FE_XMM1, 1); -TEST("\xc4\xc1\x7d\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM0, FE_XMM9, 1); -TEST("\xc4\xc1\x3d\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM8, FE_XMM9, 1); -TEST("\x62\xd1\x7d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM16, FE_XMM9, 1); -TEST("\x62\xd1\x3d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM24, FE_XMM9, 1); -TEST("\x62\xb1\x7d\x28\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM0, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x28\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM8, FE_XMM17, 1); -TEST("\x62\xb1\x7d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM16, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM24, FE_XMM17, 1); -TEST("\x62\x91\x7d\x28\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM0, FE_XMM25, 1); -TEST("\x62\x91\x3d\x28\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM8, FE_XMM25, 1); -TEST("\x62\x91\x7d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM16, FE_XMM25, 1); -TEST("\x62\x91\x3d\x20\x71\xd1\x01", VPSRLW256rri, 0, FE_XMM24, FE_XMM25, 1); -TEST("\x62\xf1\x7d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM0, FE_XMM1, 1); -TEST("\x62\xf1\x3d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM8, FE_XMM1, 1); -TEST("\x62\xf1\x7d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM16, FE_XMM1, 1); -TEST("\x62\xf1\x3d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM24, FE_XMM1, 1); -TEST("\x62\xd1\x7d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM0, FE_XMM9, 1); -TEST("\x62\xd1\x3d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM8, FE_XMM9, 1); -TEST("\x62\xd1\x7d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM16, FE_XMM9, 1); -TEST("\x62\xd1\x3d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM24, FE_XMM9, 1); -TEST("\x62\xb1\x7d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM0, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM8, FE_XMM17, 1); -TEST("\x62\xb1\x7d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM16, FE_XMM17, 1); -TEST("\x62\xb1\x3d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM24, FE_XMM17, 1); -TEST("\x62\x91\x7d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM0, FE_XMM25, 1); -TEST("\x62\x91\x3d\x48\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM8, FE_XMM25, 1); -TEST("\x62\x91\x7d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM16, FE_XMM25, 1); -TEST("\x62\x91\x3d\x40\x71\xd1\x01", VPSRLW512rri, 0, FE_XMM24, FE_XMM25, 1); -// Part 2: register extension bits with rrm -TEST("\xc5\xf0\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xf1\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\xc5\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x71\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xe1\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x61\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM1, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\xc5\xb0\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xf1\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\xc5\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x71\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xe1\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x61\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM9, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xf1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xf1\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x71\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x71\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xe1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x61\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM17, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xf1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM25, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x71\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM25, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\xe1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM25, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\x62\x61\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM25, FE_MEM(FE_DX, 1, FE_BX, 0x40)); -TEST("\xc4\xa1\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xb1\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\xc4\x21\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x31\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xa1\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x21\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM1, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\xc4\xa1\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xb1\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\xc4\x21\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x31\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xa1\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x21\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM9, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xb1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xb1\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x31\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x31\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xa1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x21\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM17, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xb1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM25, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x31\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM25, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\xa1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM25, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\x62\x21\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM25, FE_MEM(FE_DX, 1, FE_R11, 0x40)); -TEST("\xc4\xc1\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xd1\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\xc4\x41\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x51\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xc1\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x41\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM1, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\xc4\xc1\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xd1\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\xc4\x41\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x51\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xc1\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x41\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM9, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xd1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xd1\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x51\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x51\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xc1\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x41\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM17, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xd1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM25, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x51\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM25, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\xc1\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM25, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\x62\x41\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM25, FE_MEM(FE_R10, 1, FE_BX, 0x40)); -TEST("\xc4\x81\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x91\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\xc4\x01\x70\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x11\x74\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x81\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x01\x74\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM1, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\xc4\x81\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x91\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\xc4\x01\x30\x58\x44\x1a\x40", VADDPS128rrm, 0, FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x11\x34\x09\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x81\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x01\x34\x08\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM9, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x91\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x91\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x11\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x11\x74\x01\x58\x44\x1a\x04", VADDPS128rrm_mask, FLAGMASK(0, FE_K1), FE_XMM8, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x81\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x01\x74\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM17, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x91\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM0, FE_XMM25, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x11\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM8, FE_XMM25, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x81\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM16, FE_XMM25, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -TEST("\x62\x01\x34\x00\x58\x44\x1a\x04", VADDPS128rrm, 0, FE_XMM24, FE_XMM25, FE_MEM(FE_R10, 1, FE_R11, 0x40)); -// Part 3: register extension bits with general-purpose register -TEST("\xc4\xe3\x71\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM1, FE_DX, 1); -TEST("\xc4\xc3\x71\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM1, FE_R10, 1); -TEST("\xc4\x63\x71\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM1, FE_DX, 1); -TEST("\xc4\x43\x71\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM1, FE_R10, 1); -TEST("\x62\xe3\x75\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM1, FE_DX, 1); -TEST("\x62\xc3\x75\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM1, FE_R10, 1); -TEST("\x62\x63\x75\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM1, FE_DX, 1); -TEST("\x62\x43\x75\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM1, FE_R10, 1); -TEST("\xc4\xe3\x31\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM9, FE_DX, 1); -TEST("\xc4\xc3\x31\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM9, FE_R10, 1); -TEST("\xc4\x63\x31\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM9, FE_DX, 1); -TEST("\xc4\x43\x31\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM9, FE_R10, 1); -TEST("\x62\xe3\x35\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM9, FE_DX, 1); -TEST("\x62\xc3\x35\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM9, FE_R10, 1); -TEST("\x62\x63\x35\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM9, FE_DX, 1); -TEST("\x62\x43\x35\x08\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM9, FE_R10, 1); -TEST("\x62\xf3\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM17, FE_DX, 1); -TEST("\x62\xd3\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM17, FE_R10, 1); -TEST("\x62\x73\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM17, FE_DX, 1); -TEST("\x62\x53\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM17, FE_R10, 1); -TEST("\x62\xe3\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM17, FE_DX, 1); -TEST("\x62\xc3\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM17, FE_R10, 1); -TEST("\x62\x63\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM17, FE_DX, 1); -TEST("\x62\x43\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM17, FE_R10, 1); -TEST("\x62\xf3\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM25, FE_DX, 1); -TEST("\x62\xd3\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM25, FE_R10, 1); -TEST("\x62\x73\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM25, FE_DX, 1); -TEST("\x62\x53\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM8, FE_XMM25, FE_R10, 1); -TEST("\x62\xe3\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM25, FE_DX, 1); -TEST("\x62\xc3\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM16, FE_XMM25, FE_R10, 1); -TEST("\x62\x63\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM25, FE_DX, 1); -TEST("\x62\x43\x35\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM24, FE_XMM25, FE_R10, 1); -// Part 4: register extensions with unusual VEX fallbacks -TEST("\xc5\xfa\x7e\xc1", VMOVQrr, 0, FE_XMM0, FE_XMM1); -TEST("\x62\xb1\xfe\x08\x7e\xc1", VMOVQrr, 0, FE_XMM0, FE_XMM17); -TEST("\xc5\xf9\x7e\xc8", VMOVD_X2Grr, 0, FE_AX, FE_XMM1); -TEST("\x62\xe1\x7d\x08\x7e\xc8", VMOVD_X2Grr, 0, FE_AX, FE_XMM17); -TEST("\xc5\xf9\x7e\x08", VMOVDmr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_XMM1); -TEST("\x62\xe1\x7d\x08\x7e\x08", VMOVDmr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_XMM17); -TEST("\xc5\xf9\x6e\xc8", VMOVD_G2Xrr, 0, FE_XMM1, FE_AX); -TEST("\x62\xe1\x7d\x08\x6e\xc8", VMOVD_G2Xrr, 0, FE_XMM17, FE_AX); -TEST("\xc5\xf9\x6e\x08", VMOVDrm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x62\xe1\x7d\x08\x6e\x08", VMOVDrm, 0, FE_XMM17, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe1\xf9\x7e\xc8", VMOVQ_X2Grr, 0, FE_AX, FE_XMM1); -TEST("\x62\xe1\xfd\x08\x7e\xc8", VMOVQ_X2Grr, 0, FE_AX, FE_XMM17); -TEST("\xc5\xf9\xd6\x08", VMOVQmr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_XMM1); -TEST("\x62\xe1\xfd\x08\xd6\x08", VMOVQmr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_XMM17); -TEST("\xc4\xe1\xf9\x6e\xc8", VMOVQ_G2Xrr, 0, FE_XMM1, FE_AX); -TEST("\x62\xe1\xfd\x08\x6e\xc8", VMOVQ_G2Xrr, 0, FE_XMM17, FE_AX); -TEST("\xc5\xfa\x7e\x08", VMOVQrm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\x62\xe1\xfe\x08\x7e\x08", VMOVQrm, 0, FE_XMM17, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe3\x71\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM1, FE_DX, 1); -TEST("\x62\xf3\x75\x00\x20\xc2\x01", VPINSRBrrri, 0, FE_XMM0, FE_XMM17, FE_DX, 1); -TEST("\xc4\xe3\x71\x20\x42\x20\x01", VPINSRBrrmi, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\x62\xf3\x75\x00\x20\x42\x20\x01", VPINSRBrrmi, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\xc5\xf1\xc4\xc2\x01", VPINSRWrrri, 0, FE_XMM0, FE_XMM1, FE_DX, 1); -TEST("\x62\xf1\x75\x00\xc4\xc2\x01", VPINSRWrrri, 0, FE_XMM0, FE_XMM17, FE_DX, 1); -TEST("\xc5\xf1\xc4\x42\x20\x01", VPINSRWrrmi, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\x62\xf1\x75\x00\xc4\x42\x10\x01", VPINSRWrrmi, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\xc4\xe3\x71\x22\xc2\x01", VPINSRDrrri, 0, FE_XMM0, FE_XMM1, FE_DX, 1); -TEST("\x62\xf3\x75\x00\x22\xc2\x01", VPINSRDrrri, 0, FE_XMM0, FE_XMM17, FE_DX, 1); -TEST("\xc4\xe3\x71\x22\x42\x20\x01", VPINSRDrrmi, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\x62\xf3\x75\x00\x22\x42\x08\x01", VPINSRDrrmi, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\xc4\xe3\xf1\x22\xc2\x01", VPINSRQrrri, 0, FE_XMM0, FE_XMM1, FE_DX, 1); -TEST("\x62\xf3\xf5\x00\x22\xc2\x01", VPINSRQrrri, 0, FE_XMM0, FE_XMM17, FE_DX, 1); -TEST("\xc4\xe3\xf1\x22\x42\x20\x01", VPINSRQrrmi, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\x62\xf3\xf5\x00\x22\x42\x04\x01", VPINSRQrrmi, 0, FE_XMM0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), 1); -TEST("\xc4\xe3\x79\x14\xca\x01", VPEXTRBrri, 0, FE_DX, FE_XMM1, 1); -TEST("\x62\xe3\x7d\x08\x14\xca\x01", VPEXTRBrri, 0, FE_DX, FE_XMM17, 1); -TEST("\xc4\xe3\x79\x14\x4a\x20\x01", VPEXTRBmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM1, 1); -TEST("\x62\xe3\x7d\x08\x14\x4a\x20\x01", VPEXTRBmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM17, 1); -TEST("\xc5\xf9\xc5\xd1\x01", VPEXTRWrri, 0, FE_DX, FE_XMM1, 1); -TEST("\x62\xb1\x7d\x08\xc5\xd1\x01", VPEXTRWrri, 0, FE_DX, FE_XMM17, 1); -TEST("\xc4\xe3\x79\x15\x4a\x20\x01", VPEXTRWmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM1, 1); -TEST("\x62\xe3\x7d\x08\x15\x4a\x10\x01", VPEXTRWmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM17, 1); -TEST("\xc4\xe3\x79\x16\xca\x01", VPEXTRDrri, 0, FE_DX, FE_XMM1, 1); -TEST("\x62\xe3\x7d\x08\x16\xca\x01", VPEXTRDrri, 0, FE_DX, FE_XMM17, 1); -TEST("\xc4\xe3\x79\x16\x4a\x20\x01", VPEXTRDmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM1, 1); -TEST("\x62\xe3\x7d\x08\x16\x4a\x08\x01", VPEXTRDmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM17, 1); -TEST("\xc4\xe3\xf9\x16\xca\x01", VPEXTRQrri, 0, FE_DX, FE_XMM1, 1); -TEST("\x62\xe3\xfd\x08\x16\xca\x01", VPEXTRQrri, 0, FE_DX, FE_XMM17, 1); -TEST("\xc4\xe3\xf9\x16\x4a\x20\x01", VPEXTRQmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM1, 1); -TEST("\x62\xe3\xfd\x08\x16\x4a\x04\x01", VPEXTRQmri, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x20), FE_XMM17, 1); -TEST("\xc4\xe2\x79\x78\xc8", VPBROADCASTB128rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x08\x78\xc8", VPBROADCASTB128rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x7d\x78\xc8", VPBROADCASTB256rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x28\x78\xc8", VPBROADCASTB256rr, 0, FE_XMM17, FE_XMM0); -TEST("\x62\xf2\x7d\x48\x78\xc8", VPBROADCASTB512rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x48\x78\xc8", VPBROADCASTB512rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x79\x78\x4a\x20", VPBROADCASTB128rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x08\x78\x4a\x20", VPBROADCASTB128rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x7d\x78\x4a\x20", VPBROADCASTB256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x28\x78\x4a\x20", VPBROADCASTB256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x78\x4a\x20", VPBROADCASTB512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x48\x78\x4a\x20", VPBROADCASTB512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x79\x79\xc8", VPBROADCASTW128rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x08\x79\xc8", VPBROADCASTW128rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x7d\x79\xc8", VPBROADCASTW256rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x28\x79\xc8", VPBROADCASTW256rr, 0, FE_XMM17, FE_XMM0); -TEST("\x62\xf2\x7d\x48\x79\xc8", VPBROADCASTW512rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x48\x79\xc8", VPBROADCASTW512rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x79\x79\x4a\x20", VPBROADCASTW128rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x08\x79\x4a\x10", VPBROADCASTW128rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x7d\x79\x4a\x20", VPBROADCASTW256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x28\x79\x4a\x10", VPBROADCASTW256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x79\x4a\x10", VPBROADCASTW512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x48\x79\x4a\x10", VPBROADCASTW512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x79\x58\xc8", VPBROADCASTD128rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x08\x58\xc8", VPBROADCASTD128rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x7d\x58\xc8", VPBROADCASTD256rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x28\x58\xc8", VPBROADCASTD256rr, 0, FE_XMM17, FE_XMM0); -TEST("\x62\xf2\x7d\x48\x58\xc8", VPBROADCASTD512rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\x7d\x48\x58\xc8", VPBROADCASTD512rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x79\x58\x4a\x20", VPBROADCASTD128rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x08\x58\x4a\x08", VPBROADCASTD128rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x7d\x58\x4a\x20", VPBROADCASTD256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x28\x58\x4a\x08", VPBROADCASTD256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x58\x4a\x08", VPBROADCASTD512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x48\x58\x4a\x08", VPBROADCASTD512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x79\x59\xc8", VPBROADCASTQ128rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\xfd\x08\x59\xc8", VPBROADCASTQ128rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x7d\x59\xc8", VPBROADCASTQ256rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\xfd\x28\x59\xc8", VPBROADCASTQ256rr, 0, FE_XMM17, FE_XMM0); -TEST("\x62\xf2\xfd\x48\x59\xc8", VPBROADCASTQ512rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xe2\xfd\x48\x59\xc8", VPBROADCASTQ512rr, 0, FE_XMM17, FE_XMM0); -TEST("\xc4\xe2\x79\x59\x4a\x20", VPBROADCASTQ128rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x08\x59\x4a\x04", VPBROADCASTQ128rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x7d\x59\x4a\x20", VPBROADCASTQ256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x28\x59\x4a\x04", VPBROADCASTQ256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x48\x59\x4a\x04", VPBROADCASTQ512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x48\x59\x4a\x04", VPBROADCASTQ512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc4\xe2\x7d\x5a\x4a\x20", VBROADCASTI128rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("", VBROADCASTI128rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); // no EVEX version exists -TEST("\x62\xf2\x7d\x28\x5a\x4a\x02", VBROADCASTI32X4_256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x28\x5a\x4a\x02", VBROADCASTI32X4_256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x5a\x4a\x02", VBROADCASTI32X4_512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x48\x5a\x4a\x02", VBROADCASTI32X4_512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x28\x5a\x4a\x02", VBROADCASTI64X2_256rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x28\x5a\x4a\x02", VBROADCASTI64X2_256rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x48\x5a\x4a\x02", VBROADCASTI64X2_512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x48\x5a\x4a\x02", VBROADCASTI64X2_512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x5b\x4a\x01", VBROADCASTI32X8_512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\x7d\x48\x5b\x4a\x01", VBROADCASTI32X8_512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x48\x5b\x4a\x01", VBROADCASTI64X4_512rm, 0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xe2\xfd\x48\x5b\x4a\x01", VBROADCASTI64X4_512rm, 0, FE_XMM17, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x08\x7a\xca", VPBROADCASTB_GP128rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x08\x7a\xca", VPBROADCASTB_GP128rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x28\x7a\xca", VPBROADCASTB_GP256rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x28\x7a\xca", VPBROADCASTB_GP256rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x48\x7a\xca", VPBROADCASTB_GP512rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x48\x7a\xca", VPBROADCASTB_GP512rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x08\x7b\xca", VPBROADCASTW_GP128rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x08\x7b\xca", VPBROADCASTW_GP128rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x28\x7b\xca", VPBROADCASTW_GP256rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x28\x7b\xca", VPBROADCASTW_GP256rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x48\x7b\xca", VPBROADCASTW_GP512rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x48\x7b\xca", VPBROADCASTW_GP512rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x08\x7c\xca", VPBROADCASTD_GP128rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x08\x7c\xca", VPBROADCASTD_GP128rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x28\x7c\xca", VPBROADCASTD_GP256rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x28\x7c\xca", VPBROADCASTD_GP256rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\x7d\x48\x7c\xca", VPBROADCASTD_GP512rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\x7d\x48\x7c\xca", VPBROADCASTD_GP512rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\xfd\x08\x7c\xca", VPBROADCASTQ_GP128rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\xfd\x08\x7c\xca", VPBROADCASTQ_GP128rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\xfd\x28\x7c\xca", VPBROADCASTQ_GP256rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\xfd\x28\x7c\xca", VPBROADCASTQ_GP256rr, 0, FE_XMM17, FE_DX); -TEST("\x62\xf2\xfd\x48\x7c\xca", VPBROADCASTQ_GP512rr, 0, FE_XMM1, FE_DX); -TEST("\x62\xe2\xfd\x48\x7c\xca", VPBROADCASTQ_GP512rr, 0, FE_XMM17, FE_DX); -// Part 5: masks -TEST("\x62\xf1\x74\x09\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x89\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0a\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K2), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8a\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K2), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0b\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K3), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8b\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K3), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0c\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K4), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8c\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K4), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0d\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K5), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8d\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K5), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0e\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K6), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8e\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K6), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x0f\x58\xc2", VADDPS128rrr_mask, FLAGMASK(0, FE_K7), FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x8f\x58\xc2", VADDPS128rrr_maskz, FLAGMASK(0, FE_K7), FE_XMM0, FE_XMM1, FE_XMM2); -// Part 6: memory operands: disp8 compression + broadcast -TEST("\xc5\xf0\x58\x02", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\xc5\xf0\x58\x42\x01", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\xc5\xf0\x58\x42\xff", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\xc5\xf0\x58\x42\x10", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\xc5\xf0\x58\x42\xf0", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x10)); -TEST("\xc5\xf0\x58\x82\xf0\x07\x00\x00", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x7f0)); -TEST("\xc5\xf0\x58\x82\x00\x08\x00\x00", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x800)); -TEST("\xc5\xf0\x58\x82\x00\xf8\xff\xff", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x800)); -TEST("\xc5\xf0\x58\x82\xf0\xf7\xff\xff", VADDPS128rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x810)); -TEST("\x62\xf1\x74\x89\x58\x02", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x89\x58\x82\x01\x00\x00\x00", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x89\x58\x82\xff\xff\xff\xff", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x89\x58\x42\x01", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\x62\xf1\x74\x89\x58\x42\xff", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x10)); -TEST("\x62\xf1\x74\x89\x58\x42\x7f", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x7f0)); -TEST("\x62\xf1\x74\x89\x58\x82\x00\x08\x00\x00", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x800)); -TEST("\x62\xf1\x74\x89\x58\x42\x80", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x800)); -TEST("\x62\xf1\x74\x89\x58\x82\xf0\xf7\xff\xff", VADDPS128rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x810)); -TEST("\x62\xf1\x74\x18\x58\x02", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x18\x58\x82\x01\x00\x00\x00", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x18\x58\x82\xff\xff\xff\xff", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x18\x58\x42\x01", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\x18\x58\x42\xff", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\x18\x58\x42\x7f", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\x18\x58\x82\x00\x02\x00\x00", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\x18\x58\x42\x80", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\x18\x58\x82\xfc\xfd\xff\xff", VADDPS128rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -TEST("\x62\xf1\x74\x99\x58\x02", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x99\x58\x82\x01\x00\x00\x00", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x99\x58\x82\xff\xff\xff\xff", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x99\x58\x42\x01", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\x99\x58\x42\xff", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\x99\x58\x42\x7f", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\x99\x58\x82\x00\x02\x00\x00", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\x99\x58\x42\x80", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\x99\x58\x82\xfc\xfd\xff\xff", VADDPS128rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -TEST("\xc5\xf4\x58\x02", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\xc5\xf4\x58\x42\x01", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\xc5\xf4\x58\x42\xff", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\xc5\xf4\x58\x42\x20", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\xc5\xf4\x58\x42\xe0", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x20)); -TEST("\xc5\xf4\x58\x82\xe0\x0f\x00\x00", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0xfe0)); -TEST("\xc5\xf4\x58\x82\x00\x10\x00\x00", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1000)); -TEST("\xc5\xf4\x58\x82\x00\xf0\xff\xff", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x1000)); -TEST("\xc5\xf4\x58\x82\xe0\xef\xff\xff", VADDPS256rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x1020)); -TEST("\x62\xf1\x74\xa9\x58\x02", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\xa9\x58\x82\x01\x00\x00\x00", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\xa9\x58\x82\xff\xff\xff\xff", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\xa9\x58\x42\x01", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf1\x74\xa9\x58\x42\xff", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x20)); -TEST("\x62\xf1\x74\xa9\x58\x42\x7f", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0xfe0)); -TEST("\x62\xf1\x74\xa9\x58\x82\x00\x10\x00\x00", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1000)); -TEST("\x62\xf1\x74\xa9\x58\x42\x80", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x1000)); -TEST("\x62\xf1\x74\xa9\x58\x82\xe0\xef\xff\xff", VADDPS256rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x1020)); -TEST("\x62\xf1\x74\x38\x58\x02", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x38\x58\x82\x01\x00\x00\x00", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x38\x58\x82\xff\xff\xff\xff", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x38\x58\x42\x01", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\x38\x58\x42\xff", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\x38\x58\x42\x7f", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\x38\x58\x82\x00\x02\x00\x00", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\x38\x58\x42\x80", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\x38\x58\x82\xfc\xfd\xff\xff", VADDPS256rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -TEST("\x62\xf1\x74\xb9\x58\x02", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\xb9\x58\x82\x01\x00\x00\x00", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\xb9\x58\x82\xff\xff\xff\xff", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\xb9\x58\x42\x01", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\xb9\x58\x42\xff", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\xb9\x58\x42\x7f", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\xb9\x58\x82\x00\x02\x00\x00", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\xb9\x58\x42\x80", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\xb9\x58\x82\xfc\xfd\xff\xff", VADDPS256rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -TEST("\x62\xf1\x74\x48\x58\x02", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x48\x58\x82\x01\x00\x00\x00", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x48\x58\x82\xff\xff\xff\xff", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x48\x58\x42\x01", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x40)); -TEST("\x62\xf1\x74\x48\x58\x42\xff", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x40)); -TEST("\x62\xf1\x74\x48\x58\x42\x7f", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc0)); -TEST("\x62\xf1\x74\x48\x58\x82\x00\x20\x00\x00", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x2000)); -TEST("\x62\xf1\x74\x48\x58\x42\x80", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x2000)); -TEST("\x62\xf1\x74\x48\x58\x82\xc0\xdf\xff\xff", VADDPS512rrm, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x2040)); -TEST("\x62\xf1\x74\xc9\x58\x02", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\xc9\x58\x82\x01\x00\x00\x00", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\xc9\x58\x82\xff\xff\xff\xff", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\xc9\x58\x42\x01", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x40)); -TEST("\x62\xf1\x74\xc9\x58\x42\xff", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x40)); -TEST("\x62\xf1\x74\xc9\x58\x42\x7f", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc0)); -TEST("\x62\xf1\x74\xc9\x58\x82\x00\x20\x00\x00", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x2000)); -TEST("\x62\xf1\x74\xc9\x58\x42\x80", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x2000)); -TEST("\x62\xf1\x74\xc9\x58\x82\xc0\xdf\xff\xff", VADDPS512rrm_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x2040)); -TEST("\x62\xf1\x74\x58\x58\x02", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\x58\x58\x82\x01\x00\x00\x00", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\x58\x58\x82\xff\xff\xff\xff", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\x58\x58\x42\x01", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\x58\x58\x42\xff", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\x58\x58\x42\x7f", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\x58\x58\x82\x00\x02\x00\x00", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\x58\x58\x42\x80", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\x58\x58\x82\xfc\xfd\xff\xff", VADDPS512rrb, 0, FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -TEST("\x62\xf1\x74\xd9\x58\x02", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0)); -TEST("\x62\xf1\x74\xd9\x58\x82\x01\x00\x00\x00", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 1)); -TEST("\x62\xf1\x74\xd9\x58\x82\xff\xff\xff\xff", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -1)); -TEST("\x62\xf1\x74\xd9\x58\x42\x01", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x4)); -TEST("\x62\xf1\x74\xd9\x58\x42\xff", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x4)); -TEST("\x62\xf1\x74\xd9\x58\x42\x7f", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x1fc)); -TEST("\x62\xf1\x74\xd9\x58\x82\x00\x02\x00\x00", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x200)); -TEST("\x62\xf1\x74\xd9\x58\x42\x80", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x200)); -TEST("\x62\xf1\x74\xd9\x58\x82\xfc\xfd\xff\xff", VADDPS512rrb_maskz, FLAGMASK(0, FE_K1), FE_XMM0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, -0x204)); -// Part 7: ER/SAE -TEST("\x62\xf1\x74\x48\x58\xc2", VADDPS512rrr, 0, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x18\x58\xc2", VADDPS512rrr_er, FE_RC_RN, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x38\x58\xc2", VADDPS512rrr_er, FE_RC_RD, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x58\x58\xc2", VADDPS512rrr_er, FE_RC_RU, FE_XMM0, FE_XMM1, FE_XMM2); -TEST("\x62\xf1\x74\x78\x58\xc2", VADDPS512rrr_er, FE_RC_RZ, FE_XMM0, FE_XMM1, FE_XMM2); -// Part 8: VSIB -TEST("", VPGATHERDD128rm, FLAGMASK(0, FE_K0), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); // k0 not allowed -TEST("\x62\xf2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); -TEST("\x62\xf2\x7d\x09\x90\x44\x08\x04", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM1, 0x10)); -TEST("\x62\xf2\x7d\x09\x90\x84\x08\x11\x00\x00\x00", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM1, 0x11)); -TEST("\x62\xf2\x7d\x09\x90\x04\x0d\x00\x00\x00\x00", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_NOREG, 1, FE_XMM1, 0)); -TEST("\x62\xf2\x7d\x09\x90\x84\xc8\x11\x00\x00\x00", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 8, FE_XMM1, 0x11)); -TEST("\x62\xf2\x7d\x09\x90\x04\xcd\x00\x00\x00\x00", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_NOREG, 8, FE_XMM1, 0)); -TEST("\x62\xf2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); -TEST("\x62\xd2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_R8, 1, FE_XMM1, 0)); -TEST("\x62\xb2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM9, 0)); -TEST("\x62\x92\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_R8, 1, FE_XMM9, 0)); -TEST("\x62\xf2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM17, 0)); -TEST("\x62\xd2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_R8, 1, FE_XMM17, 0)); -TEST("\x62\xb2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_AX, 1, FE_XMM25, 0)); -TEST("\x62\x92\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM0, FE_MEMV(FE_R8, 1, FE_XMM25, 0)); -TEST("\x62\x72\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); -TEST("\x62\x52\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_R8, 1, FE_XMM1, 0)); -TEST("\x62\x32\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_AX, 1, FE_XMM9, 0)); -TEST("\x62\x12\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_R8, 1, FE_XMM9, 0)); -TEST("\x62\x72\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_AX, 1, FE_XMM17, 0)); -TEST("\x62\x52\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_R8, 1, FE_XMM17, 0)); -TEST("\x62\x32\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_AX, 1, FE_XMM25, 0)); -TEST("\x62\x12\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM8, FE_MEMV(FE_R8, 1, FE_XMM25, 0)); -TEST("\x62\xe2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); -TEST("\x62\xc2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_R8, 1, FE_XMM1, 0)); -TEST("\x62\xa2\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_AX, 1, FE_XMM9, 0)); -TEST("\x62\x82\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_R8, 1, FE_XMM9, 0)); -TEST("\x62\xe2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_AX, 1, FE_XMM17, 0)); -TEST("\x62\xc2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_R8, 1, FE_XMM17, 0)); -TEST("\x62\xa2\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_AX, 1, FE_XMM25, 0)); -TEST("\x62\x82\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM16, FE_MEMV(FE_R8, 1, FE_XMM25, 0)); -TEST("\x62\x62\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_AX, 1, FE_XMM1, 0)); -TEST("\x62\x42\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_R8, 1, FE_XMM1, 0)); -TEST("\x62\x22\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_AX, 1, FE_XMM9, 0)); -TEST("\x62\x02\x7d\x09\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_R8, 1, FE_XMM9, 0)); -TEST("\x62\x62\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_AX, 1, FE_XMM17, 0)); -TEST("\x62\x42\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_R8, 1, FE_XMM17, 0)); -TEST("\x62\x22\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_AX, 1, FE_XMM25, 0)); -TEST("\x62\x02\x7d\x01\x90\x04\x08", VPGATHERDD128rm, FLAGMASK(0, FE_K1), FE_XMM24, FE_MEMV(FE_R8, 1, FE_XMM25, 0)); - -// VCVTTPD2DQ has different W bit for VEX/EVEX, so fallback is implemented using -// REXW flip. Test that this works. -TEST("\xc4\x41\x79\xe6\xf7", VCVTTPD2DQ128rr, 0, FE_XMM14, FE_XMM15); -TEST("\xc4\x41\x7d\xe6\xf7", VCVTTPD2DQ256rr, 0, FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x48\xe6\xf7", VCVTTPD2DQ512rr, 0, FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x18\xe6\xf7", VCVTTPD2DQ512rr_sae, 0, FE_XMM14, FE_XMM15); -TEST("\xc4\x01\x79\xe6\x74\x37\x40", VCVTTPD2DQ128rm, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\xc4\x01\x7d\xe6\x74\x37\x40", VCVTTPD2DQ256rm, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x48\xe6\x74\x37\x01", VCVTTPD2DQ512rm, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x18\xe6\x74\x37\x08", VCVTTPD2DQ128rb, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x38\xe6\x74\x37\x08", VCVTTPD2DQ256rb, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x58\xe6\x74\x37\x08", VCVTTPD2DQ512rb, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x51\xfd\x09\xe6\xf7", VCVTTPD2DQ128rr_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x29\xe6\xf7", VCVTTPD2DQ256rr_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x49\xe6\xf7", VCVTTPD2DQ512rr_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x19\xe6\xf7", VCVTTPD2DQ512rr_mask_sae, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x11\xfd\x09\xe6\x74\x37\x04", VCVTTPD2DQ128rm_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x29\xe6\x74\x37\x02", VCVTTPD2DQ256rm_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x49\xe6\x74\x37\x01", VCVTTPD2DQ512rm_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x19\xe6\x74\x37\x08", VCVTTPD2DQ128rb_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x39\xe6\x74\x37\x08", VCVTTPD2DQ256rb_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x59\xe6\x74\x37\x08", VCVTTPD2DQ512rb_mask, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x51\xfd\x89\xe6\xf7", VCVTTPD2DQ128rr_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\xa9\xe6\xf7", VCVTTPD2DQ256rr_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\xc9\xe6\xf7", VCVTTPD2DQ512rr_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x51\xfd\x99\xe6\xf7", VCVTTPD2DQ512rr_maskz_sae, FLAGMASK(0, FE_K1), FE_XMM14, FE_XMM15); -TEST("\x62\x11\xfd\x89\xe6\x74\x37\x04", VCVTTPD2DQ128rm_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\xa9\xe6\x74\x37\x02", VCVTTPD2DQ256rm_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\xc9\xe6\x74\x37\x01", VCVTTPD2DQ512rm_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\x99\xe6\x74\x37\x08", VCVTTPD2DQ128rb_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\xb9\xe6\x74\x37\x08", VCVTTPD2DQ256rb_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x11\xfd\xd9\xe6\x74\x37\x08", VCVTTPD2DQ512rb_maskz, FLAGMASK(0, FE_K1), FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); - -TEST("\xc4\x42\x7d\x19\xf7", VBROADCASTSD256rr, 0, FE_XMM14, FE_XMM15); -TEST("\xc4\x02\x7d\x19\x74\x37\x40", VBROADCASTSD256rm, 0, FE_XMM14, FE_MEM(FE_R15, 1, FE_R14, 0x40)); -TEST("\x62\x82\xfd\x28\x19\x44\x37\x08", VBROADCASTSD256rm, 0, FE_XMM16, FE_MEM(FE_R15, 1, FE_R14, 0x40)); - -// VMOVDDUP has special tuple size for L0. -TEST("\xc5\xfb\x12\x48\x08", VMOVDDUP128rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x8)); -TEST("\x62\xf1\xff\x09\x12\x48\x01", VMOVDDUP128rm_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x8)); -TEST("\xc5\xfb\x12\xc8", VMOVDDUP128rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xf1\xff\x09\x12\xc8", VMOVDDUP128rr_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_XMM0); -TEST("\xc5\xff\x12\x48\x20", VMOVDDUP256rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf1\xff\x29\x12\x48\x01", VMOVDDUP256rm_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\xc5\xff\x12\xc8", VMOVDDUP256rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xf1\xff\x29\x12\xc8", VMOVDDUP256rr_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_XMM0); -TEST("\x62\xf1\xff\x48\x12\x48\x01", VMOVDDUP512rm, 0, FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x40)); -TEST("\x62\xf1\xff\x49\x12\x48\x01", VMOVDDUP512rm_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_MEM(FE_AX, 0, FE_NOREG, 0x40)); -TEST("\x62\xf1\xff\x48\x12\xc8", VMOVDDUP512rr, 0, FE_XMM1, FE_XMM0); -TEST("\x62\xf1\xff\x49\x12\xc8", VMOVDDUP512rr_mask, FLAGMASK(0, FE_K1), FE_XMM1, FE_XMM0); - -// VPCOMPRESS and VPEXPAND have different scale size -TEST("\x62\xf2\x7d\x08\x63\x40\x20", VPCOMPRESSB128mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x28\x63\x40\x20", VPCOMPRESSB256mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x48\x63\x40\x20", VPCOMPRESSB512mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x08\x63\x40\x10", VPCOMPRESSW128mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x28\x63\x40\x10", VPCOMPRESSW256mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x48\x63\x40\x10", VPCOMPRESSW512mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x08\x8b\x40\x08", VPCOMPRESSD128mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x28\x8b\x40\x08", VPCOMPRESSD256mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x48\x8b\x40\x08", VPCOMPRESSD512mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x08\x8b\x40\x04", VPCOMPRESSQ128mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x28\x8b\x40\x04", VPCOMPRESSQ256mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\xfd\x48\x8b\x40\x04", VPCOMPRESSQ512mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20), FE_XMM0); -TEST("\x62\xf2\x7d\x08\x62\x40\x20", VPEXPANDB128rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x28\x62\x40\x20", VPEXPANDB256rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x62\x40\x20", VPEXPANDB512rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x08\x62\x40\x10", VPEXPANDW128rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x28\x62\x40\x10", VPEXPANDW256rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x48\x62\x40\x10", VPEXPANDW512rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x08\x89\x40\x08", VPEXPANDD128rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x28\x89\x40\x08", VPEXPANDD256rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\x7d\x48\x89\x40\x08", VPEXPANDD512rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x08\x89\x40\x04", VPEXPANDQ128rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x28\x89\x40\x04", VPEXPANDQ256rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); -TEST("\x62\xf2\xfd\x48\x89\x40\x04", VPEXPANDQ512rm, 0, FE_XMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0x20)); - -// Mask can also be destination -TEST("\x62\xf1\x74\x08\xc2\xc2\x01", VCMPPS128krri, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x09\xc2\xc2\x01", VCMPPS128krri_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x08\xc2\x02\x01", VCMPPS128krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x09\xc2\x02\x01", VCMPPS128krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x08\xc2\x42\x08\x01", VCMPPS128krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x09\xc2\x42\x08\x01", VCMPPS128krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x18\xc2\x42\x20\x01", VCMPPS128krbi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x19\xc2\x42\x20\x01", VCMPPS128krbi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x28\xc2\xc2\x01", VCMPPS256krri, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x29\xc2\xc2\x01", VCMPPS256krri_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x28\xc2\x02\x01", VCMPPS256krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x29\xc2\x02\x01", VCMPPS256krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x28\xc2\x42\x04\x01", VCMPPS256krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x29\xc2\x42\x04\x01", VCMPPS256krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x38\xc2\x42\x20\x01", VCMPPS256krbi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x39\xc2\x42\x20\x01", VCMPPS256krbi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x48\xc2\xc2\x01", VCMPPS512krri, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x49\xc2\xc2\x01", VCMPPS512krri_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x48\xc2\x02\x01", VCMPPS512krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x49\xc2\x02\x01", VCMPPS512krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0), 1); -TEST("\x62\xf1\x74\x48\xc2\x42\x02\x01", VCMPPS512krmi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x49\xc2\x42\x02\x01", VCMPPS512krmi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x58\xc2\x42\x20\x01", VCMPPS512krbi, 0, FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x59\xc2\x42\x20\x01", VCMPPS512krbi_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_MEM(FE_DX, 0, FE_NOREG, 0x80), 1); -TEST("\x62\xf1\x74\x18\xc2\xc2\x01", VCMPPS512krri_sae, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x74\x19\xc2\xc2\x01", VCMPPS512krri_mask_sae, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x76\x08\xc2\xc2\x01", VCMPSSkrri, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x76\x09\xc2\xc2\x01", VCMPSSkrri_mask, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x76\x18\xc2\xc2\x01", VCMPSSkrri_sae, 0, FE_K0, FE_XMM1, FE_XMM2, 1); -TEST("\x62\xf1\x76\x19\xc2\xc2\x01", VCMPSSkrri_mask_sae, FLAGMASK(0, FE_K1), FE_K0, FE_XMM1, FE_XMM2, 1); - -// Mask instructions -TEST("\xc5\xcd\x41\xef", KANDBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x41\xef", KANDWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x41\xef", KANDDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x41\xef", KANDQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcd\x42\xef", KANDNBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x42\xef", KANDNWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x42\xef", KANDNDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x42\xef", KANDNQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xf9\x44\xee", KNOTBkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf8\x44\xee", KNOTWkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf9\x44\xee", KNOTDkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf8\x44\xee", KNOTQkk, 0, FE_K5, FE_K6); -TEST("\xc5\xcd\x45\xef", KORBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x45\xef", KORWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x45\xef", KORDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x45\xef", KORQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcd\x46\xef", KXNORBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x46\xef", KXNORWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x46\xef", KXNORDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x46\xef", KXNORQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcd\x47\xef", KXORBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x47\xef", KXORWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x47\xef", KXORDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x47\xef", KXORQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcd\x4a\xef", KADDBkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x4a\xef", KADDWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcd\x4a\xef", KADDDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x4a\xef", KADDQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcd\x4b\xef", KUNPCKBWkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xcc\x4b\xef", KUNPCKWDkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc4\xe1\xcc\x4b\xef", KUNPCKDQkkk, 0, FE_K5, FE_K6, FE_K7); -TEST("\xc5\xf9\x98\xee", KORTESTBkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf8\x98\xee", KORTESTWkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf9\x98\xee", KORTESTDkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf8\x98\xee", KORTESTQkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf9\x90\xee", KMOVBkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf8\x90\xee", KMOVWkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf9\x90\xee", KMOVDkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf8\x90\xee", KMOVQkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf9\x90\x7a\x10", KMOVBkm, 0, FE_K7, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\xc5\xf8\x90\x7a\x10", KMOVWkm, 0, FE_K7, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\xc4\xe1\xf9\x90\x7a\x10", KMOVDkm, 0, FE_K7, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\xc4\xe1\xf8\x90\x7a\x10", KMOVQkm, 0, FE_K7, FE_MEM(FE_DX, 0, FE_NOREG, 0x10)); -TEST("\xc5\xf9\x91\x7a\x10", KMOVBmk, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x10), FE_K7); -TEST("\xc5\xf8\x91\x7a\x10", KMOVWmk, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x10), FE_K7); -TEST("\xc4\xe1\xf9\x91\x7a\x10", KMOVDmk, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x10), FE_K7); -TEST("\xc4\xe1\xf8\x91\x7a\x10", KMOVQmk, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x10), FE_K7); -TEST("\xc5\xf9\x92\xe8", KMOVBkr, 0, FE_K5, FE_AX); -TEST("\xc5\xf8\x92\xe8", KMOVWkr, 0, FE_K5, FE_AX); -TEST("\xc5\xfb\x92\xe8", KMOVDkr, 0, FE_K5, FE_AX); -TEST("\xc4\xe1\xfb\x92\xe8", KMOVQkr, 0, FE_K5, FE_AX); -TEST("\xc5\xf9\x93\xc7", KMOVBrk, 0, FE_AX, FE_K7); -TEST("\xc5\xf8\x93\xc7", KMOVWrk, 0, FE_AX, FE_K7); -TEST("\xc5\xfb\x93\xc7", KMOVDrk, 0, FE_AX, FE_K7); -TEST("\xc4\xe1\xfb\x93\xc7", KMOVQrk, 0, FE_AX, FE_K7); -TEST("\xc5\xf9\x99\xee", KTESTBkk, 0, FE_K5, FE_K6); -TEST("\xc5\xf8\x99\xee", KTESTWkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf9\x99\xee", KTESTDkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe1\xf8\x99\xee", KTESTQkk, 0, FE_K5, FE_K6); -TEST("\xc4\xe3\x79\x30\xee\x0b", KSHIFTRBkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\xf9\x30\xee\x0b", KSHIFTRWkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\x79\x31\xee\x0b", KSHIFTRDkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\xf9\x31\xee\x0b", KSHIFTRQkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\x79\x32\xee\x0b", KSHIFTLBkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\xf9\x32\xee\x0b", KSHIFTLWkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\x79\x33\xee\x0b", KSHIFTLDkki, 0, FE_K5, FE_K6, 11); -TEST("\xc4\xe3\xf9\x33\xee\x0b", KSHIFTLQkki, 0, FE_K5, FE_K6, 11); - -// Test REX prefix -TEST("\x00\x01", ADD8mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x00\x21", ADD8mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AH); -TEST("\x40\x00\x21", ADD8mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_SP); -TEST("\x41\x00\x01", ADD8mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_AX); -TEST("", ADD8mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_AH); -TEST("\x41\x00\x21", ADD8mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_SP); -TEST("\x44\x00\x01", ADD8mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_R8); -TEST("\x45\x00\x01", ADD8mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_R8); -TEST("", ADD8mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_AH); -TEST("\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_AX); -TEST("\x00\x24\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_AH); -TEST("\x40\x00\x24\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_SP); -TEST("\x41\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_AX); -TEST("\x41\x00\x24\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_SP); -TEST("", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_AH); -TEST("\x42\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_AX); -TEST("\x42\x00\x24\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_SP); -TEST("", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_AH); -TEST("\x43\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_AX); -TEST("\x43\x00\x24\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_SP); -TEST("", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_AH); -TEST("\x44\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_R8); -TEST("\x45\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_R8); -TEST("\x46\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_R8); -TEST("\x47\x00\x04\x11", ADD8mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_R8); -TEST("\x00\xc1", ADD8rr, 0, FE_CX, FE_AX); -TEST("\x00\xc5", ADD8rr, 0, FE_CH, FE_AX); -TEST("\x40\x00\xc5", ADD8rr, 0, FE_BP, FE_AX); -TEST("\x41\x00\xc1", ADD8rr, 0, FE_R9, FE_AX); -TEST("\x00\xe1", ADD8rr, 0, FE_CX, FE_AH); -TEST("\x00\xe5", ADD8rr, 0, FE_CH, FE_AH); -TEST("", ADD8rr, 0, FE_BP, FE_AH); -TEST("", ADD8rr, 0, FE_R9, FE_AH); -TEST("\x40\x00\xe1", ADD8rr, 0, FE_CX, FE_SP); -TEST("", ADD8rr, 0, FE_CH, FE_SP); -TEST("\x40\x00\xe5", ADD8rr, 0, FE_BP, FE_SP); -TEST("\x41\x00\xe1", ADD8rr, 0, FE_R9, FE_SP); -TEST("\x44\x00\xc1", ADD8rr, 0, FE_CX, FE_R8); -TEST("", ADD8rr, 0, FE_CH, FE_R8); -TEST("\x44\x00\xc5", ADD8rr, 0, FE_BP, FE_R8); -TEST("\x45\x00\xc1", ADD8rr, 0, FE_R9, FE_R8); -TEST("\x01\x01", ADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x41\x01\x01", ADD32mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_AX); -TEST("\x44\x01\x01", ADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_R8); -TEST("\x45\x01\x01", ADD32mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_R8); -TEST("\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_AX); -TEST("\x41\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_AX); -TEST("\x42\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_AX); -TEST("\x43\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_AX); -TEST("\x44\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_R8); -TEST("\x45\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_R8); -TEST("\x46\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_R8); -TEST("\x47\x01\x04\x11", ADD32mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_R8); -TEST("\x48\x01\x01", ADD64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x49\x01\x01", ADD64mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_AX); -TEST("\x4c\x01\x01", ADD64mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_R8); -TEST("\x4d\x01\x01", ADD64mr, 0, FE_MEM(FE_R9, 0, FE_NOREG, 0), FE_R8); -TEST("\x48\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_AX); -TEST("\x49\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_AX); -TEST("\x4a\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_AX); -TEST("\x4b\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_AX); -TEST("\x4c\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_CX, 1, FE_DX, 0), FE_R8); -TEST("\x4d\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_R9, 1, FE_DX, 0), FE_R8); -TEST("\x4e\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_CX, 1, FE_R10, 0), FE_R8); -TEST("\x4f\x01\x04\x11", ADD64mr, 0, FE_MEM(FE_R9, 1, FE_R10, 0), FE_R8); -TEST("\x01\xc1", ADD32rr, 0, FE_CX, FE_AX); -TEST("\x41\x01\xc1", ADD32rr, 0, FE_R9, FE_AX); -TEST("\x44\x01\xc1", ADD32rr, 0, FE_CX, FE_R8); -TEST("\x45\x01\xc1", ADD32rr, 0, FE_R9, FE_R8); -TEST("\x48\x01\xc1", ADD64rr, 0, FE_CX, FE_AX); -TEST("\x49\x01\xc1", ADD64rr, 0, FE_R9, FE_AX); -TEST("\x4c\x01\xc1", ADD64rr, 0, FE_CX, FE_R8); -TEST("\x4d\x01\xc1", ADD64rr, 0, FE_R9, FE_R8); - -// Test ModRM encoding -TEST("\x01\x00", ADD32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x04\x24", ADD32mr, 0, FE_MEM(FE_SP, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x45\x00", ADD32mr, 0, FE_MEM(FE_BP, 0, FE_NOREG, 0), FE_AX); -TEST("\x41\x01\x45\x00", ADD32mr, 0, FE_MEM(FE_R13, 0, FE_NOREG, 0), FE_AX); -TEST("\x41\x01\x45\x80", ADD32mr, 0, FE_MEM(FE_R13, 0, FE_NOREG, -0x80), FE_AX); -TEST("\x41\x01\x85\x80\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_R13, 0, FE_NOREG, 0x80), FE_AX); -TEST("\x01\x04\x25\x01\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_NOREG, 0, FE_NOREG, 0x1), FE_AX); -TEST("\x01\x04\x25\x00\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_NOREG, 0, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 0, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 3, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 5, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 9, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 15, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 1, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 2, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 3, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 8, FE_NOREG, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 15, FE_NOREG, 0), FE_AX); -TEST("\x01\x04\x05\x00\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_NOREG, 1, FE_AX, 0), FE_AX); -TEST("\x01\x04\xc5\x00\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_NOREG, 8, FE_AX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 8, FE_SP, 0), FE_AX); -TEST("\x42\x01\x04\x05\x00\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_NOREG, 1, FE_R8, 0), FE_AX); -// RIP-relative addressing, adds instruction size to offset. -TEST("\x01\x05\x01\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x7), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_IP, 1, FE_AX, 0x7), FE_AX); -TEST("\x0f\xaf\x05\xf9\xff\xff\xff", IMUL32rm, 0, FE_AX, FE_MEM(FE_IP, 0, FE_NOREG, 0)); -TEST("\x6b\x05\xf9\xff\xff\xff\x02", IMUL32rmi, 0, FE_AX, FE_MEM(FE_IP, 0, FE_NOREG, 0), 2); -TEST("\x66\x6b\x05\xf8\xff\xff\xff\x02", IMUL16rmi, 0, FE_AX, FE_MEM(FE_IP, 0, FE_NOREG, 0), 2); -TEST("\x69\x05\xf6\xff\xff\xff\x80\x00\x00\x00", IMUL32rmi, 0, FE_AX, FE_MEM(FE_IP, 0, FE_NOREG, 0), 0x80); -TEST("\x66\x69\x05\xf7\xff\xff\xff\x80\x00", IMUL16rmi, 0, FE_AX, FE_MEM(FE_IP, 0, FE_NOREG, 0), 0x80); -// Test RIP-relative addressing with various prefixes -TEST("\x01\x05\x0a\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x44\x01\x05\x09\x00\x00\x00", ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x67\x01\x05\x09\x00\x00\x00", ADD32mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x67\x44\x01\x05\x08\x00\x00\x00", ADD32mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x01\x05\x09\x00\x00\x00", ADD32mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x44\x01\x05\x08\x00\x00\x00", ADD32mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x67\x01\x05\x08\x00\x00\x00", ADD32mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x67\x44\x01\x05\x07\x00\x00\x00", ADD32mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x66\x01\x05\x09\x00\x00\x00", ADD16mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x66\x44\x01\x05\x08\x00\x00\x00", ADD16mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x67\x66\x01\x05\x08\x00\x00\x00", ADD16mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x67\x66\x44\x01\x05\x07\x00\x00\x00", ADD16mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x66\x01\x05\x08\x00\x00\x00", ADD16mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x66\x44\x01\x05\x07\x00\x00\x00", ADD16mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x67\x66\x01\x05\x07\x00\x00\x00", ADD16mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x67\x66\x44\x01\x05\x06\x00\x00\x00", ADD16mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\xf0\x01\x05\x09\x00\x00\x00", LOCK_ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\xf0\x44\x01\x05\x08\x00\x00\x00", LOCK_ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x67\xf0\x01\x05\x08\x00\x00\x00", LOCK_ADD32mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x67\xf0\x44\x01\x05\x07\x00\x00\x00", LOCK_ADD32mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\xf0\x01\x05\x08\x00\x00\x00", LOCK_ADD32mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\xf0\x44\x01\x05\x07\x00\x00\x00", LOCK_ADD32mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x67\xf0\x01\x05\x07\x00\x00\x00", LOCK_ADD32mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x67\xf0\x44\x01\x05\x06\x00\x00\x00", LOCK_ADD32mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\xf0\x66\x01\x05\x08\x00\x00\x00", LOCK_ADD16mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\xf0\x66\x44\x01\x05\x07\x00\x00\x00", LOCK_ADD16mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x67\xf0\x66\x01\x05\x07\x00\x00\x00", LOCK_ADD16mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x67\xf0\x66\x44\x01\x05\x06\x00\x00\x00", LOCK_ADD16mr, FE_ADDR32, FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\xf0\x66\x01\x05\x07\x00\x00\x00", LOCK_ADD16mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\xf0\x66\x44\x01\x05\x06\x00\x00\x00", LOCK_ADD16mr, FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\x64\x67\xf0\x66\x01\x05\x06\x00\x00\x00", LOCK_ADD16mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_AX); -TEST("\x64\x67\xf0\x66\x44\x01\x05\x05\x00\x00\x00", LOCK_ADD16mr, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_IP, 0, FE_NOREG, 0x10), FE_R8); -TEST("\xc5\xf9\x6e\x05\x08\x00\x00\x00", VMOVDrm, 0, FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\xc4\xe1\xf9\x6e\x05\x07\x00\x00\x00", VMOVQ_G2Xrm, 0, FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x67\xc5\xf9\x6e\x05\x07\x00\x00\x00", VMOVDrm, FE_ADDR32, FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x67\xc4\xe1\xf9\x6e\x05\x06\x00\x00\x00", VMOVQ_G2Xrm, FE_ADDR32, FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\xc5\xf9\x6e\x05\x07\x00\x00\x00", VMOVDrm, FE_SEG(FE_FS), FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\xc4\xe1\xf9\x6e\x05\x06\x00\x00\x00", VMOVQ_G2Xrm, FE_SEG(FE_FS), FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\x67\xc5\xf9\x6e\x05\x06\x00\x00\x00", VMOVDrm, FE_ADDR32|FE_SEG(FE_FS), FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\x67\xc4\xe1\xf9\x6e\x05\x05\x00\x00\x00", VMOVQ_G2Xrm, FE_ADDR32|FE_SEG(FE_FS), FE_XMM0, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x62\xe1\x7d\x08\x6e\x05\x06\x00\x00\x00", VMOVDrm, 0, FE_XMM16, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x67\x62\xe1\x7d\x08\x6e\x05\x05\x00\x00\x00", VMOVDrm, FE_ADDR32, FE_XMM16, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\x62\xe1\x7d\x08\x6e\x05\x05\x00\x00\x00", VMOVDrm, FE_SEG(FE_FS), FE_XMM16, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); -TEST("\x64\x67\x62\xe1\x7d\x08\x6e\x05\x04\x00\x00\x00", VMOVDrm, FE_ADDR32|FE_SEG(FE_FS), FE_XMM16, FE_MEM(FE_IP, 0, FE_NOREG, 0x10)); - -TEST("\x01\x00", ADD32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x01", ADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x02", ADD32mr, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x03", ADD32mr, 0, FE_MEM(FE_BX, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x04\x80", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x81", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x82", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x83", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x84", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x85\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x04\x86", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x87", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_AX, 0), FE_AX); -TEST("\x01\x04\x88", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x89", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x8a", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x8b", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x8c", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x8d\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x04\x8e", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x8f", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_CX, 0), FE_AX); -TEST("\x01\x04\x90", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x91", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x92", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x93", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x94", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x95\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x04\x96", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x97", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DX, 0), FE_AX); -TEST("\x01\x04\x98", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x9a", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x9b", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x9c", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x9d\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x04\x9e", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BX, 0), FE_AX); -TEST("\x01\x04\x9f", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BX, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SP, 0), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SP, 0), FE_AX); -TEST("\x01\x04\xa8", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xa9", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xaa", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xab", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xac", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xad\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x04\xae", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xaf", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BP, 0), FE_AX); -TEST("\x01\x04\xb0", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb1", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb2", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb3", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb4", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb5\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x04\xb6", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb7", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SI, 0), FE_AX); -TEST("\x01\x04\xb8", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xb9", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xba", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xbb", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xbc", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xbd\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_NOREG, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x04\xbe", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DI, 0), FE_AX); -TEST("\x01\x04\xbf", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DI, 0), FE_AX); -TEST("\x01\x05\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_IP, 0, FE_NOREG, 0x44332217), FE_AX); -TEST("\x01\x06", ADD32mr, 0, FE_MEM(FE_SI, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x07", ADD32mr, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0), FE_AX); -TEST("\x01\x40\x99", ADD32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x41\x99", ADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x42\x99", ADD32mr, 0, FE_MEM(FE_DX, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x43\x99", ADD32mr, 0, FE_MEM(FE_BX, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x44\x80\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x81\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x82\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x83\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x84\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x85\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x86\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x87\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_AX, -0x67), FE_AX); -TEST("\x01\x44\x88\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x89\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8a\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8b\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8c\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8d\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8e\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x8f\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_CX, -0x67), FE_AX); -TEST("\x01\x44\x90\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x91\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x92\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x93\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x94\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x95\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x96\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x97\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DX, -0x67), FE_AX); -TEST("\x01\x44\x98\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x99\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9a\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9b\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9c\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9d\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9e\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BX, -0x67), FE_AX); -TEST("\x01\x44\x9f\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BX, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SP, -0x67), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SP, -0x67), FE_AX); -TEST("\x01\x44\xa8\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xa9\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xaa\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xab\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xac\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xad\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xae\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xaf\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BP, -0x67), FE_AX); -TEST("\x01\x44\xb0\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb1\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb2\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb3\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb4\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb5\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb6\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb7\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SI, -0x67), FE_AX); -TEST("\x01\x44\xb8\x99", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xb9\x99", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xba\x99", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xbb\x99", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xbc\x99", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xbd\x99", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xbe\x99", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x44\xbf\x99", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DI, -0x67), FE_AX); -TEST("\x01\x45\x99", ADD32mr, 0, FE_MEM(FE_BP, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x46\x99", ADD32mr, 0, FE_MEM(FE_SI, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x47\x99", ADD32mr, 0, FE_MEM(FE_DI, 0, FE_NOREG, -0x67), FE_AX); -TEST("\x01\x80\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x81\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x82\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x83\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x84\x80\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x81\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x82\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x83\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x84\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x85\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x86\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x87\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_AX, 0x44332211), FE_AX); -TEST("\x01\x84\x88\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x89\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8a\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8b\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8c\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8d\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8e\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x8f\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_CX, 0x44332211), FE_AX); -TEST("\x01\x84\x90\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x91\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x92\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x93\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x94\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x95\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x96\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x97\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DX, 0x44332211), FE_AX); -TEST("\x01\x84\x98\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x99\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9a\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9b\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9c\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9d\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9e\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BX, 0x44332211), FE_AX); -TEST("\x01\x84\x9f\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BX, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SP, 0x44332211), FE_AX); -TEST("", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SP, 0x44332211), FE_AX); -TEST("\x01\x84\xa8\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xa9\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xaa\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xab\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xac\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xad\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xae\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xaf\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_BP, 0x44332211), FE_AX); -TEST("\x01\x84\xb0\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb1\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb2\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb3\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb4\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb5\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb6\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb7\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_SI, 0x44332211), FE_AX); -TEST("\x01\x84\xb8\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_AX, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xb9\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_CX, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xba\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DX, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xbb\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BX, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xbc\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SP, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xbd\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xbe\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x84\xbf\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 4, FE_DI, 0x44332211), FE_AX); -TEST("\x01\x85\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_BP, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x86\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_SI, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\x87\x11\x22\x33\x44", ADD32mr, 0, FE_MEM(FE_DI, 0, FE_NOREG, 0x44332211), FE_AX); -TEST("\x01\xc0", ADD32rr, 0, FE_AX, FE_AX); -TEST("\x01\xc1", ADD32rr, 0, FE_CX, FE_AX); -TEST("\x01\xc2", ADD32rr, 0, FE_DX, FE_AX); -TEST("\x01\xc3", ADD32rr, 0, FE_BX, FE_AX); -TEST("\x01\xc4", ADD32rr, 0, FE_SP, FE_AX); -TEST("\x01\xc5", ADD32rr, 0, FE_BP, FE_AX); -TEST("\x01\xc6", ADD32rr, 0, FE_SI, FE_AX); -TEST("\x01\xc7", ADD32rr, 0, FE_DI, FE_AX); - -// AMX -TEST("\xc4\xe2\x78\x49\x00", LDTILECFGm, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x79\x49\x00", STTILECFGm, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); -TEST("\xc4\xe2\x78\x49\xc0", TILERELEASE, 0); -TEST("\xc4\xe2\x7b\x49\xc0", TILEZEROr, 0, FE_TMM0); -TEST("\xc4\xe2\x7b\x49\xc8", TILEZEROr, 0, FE_TMM1); -TEST("\xc4\xe2\x7b\x49\xf8", TILEZEROr, 0, FE_TMM7); -TEST("\xc4\xe2\x7b\x4b\x04\x10", TILELOADDrm, 0, FE_TMM0, FE_MEM(FE_AX, 1, FE_DX, 0)); -TEST("\xc4\xe2\x7b\x4b\x04\x20", TILELOADDrm, 0, FE_TMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); // has SIB -TEST("\xc4\xe2\x79\x4b\x04\x10", TILELOADDT1rm, 0, FE_TMM0, FE_MEM(FE_AX, 1, FE_DX, 0)); -TEST("\xc4\xe2\x79\x4b\x04\x20", TILELOADDT1rm, 0, FE_TMM0, FE_MEM(FE_AX, 0, FE_NOREG, 0)); // has SIB -TEST("\xc4\xe2\x7a\x4b\x04\x10", TILESTOREDmr, 0, FE_MEM(FE_AX, 1, FE_DX, 0), FE_TMM0); -TEST("\xc4\xe2\x7a\x4b\x04\x20", TILESTOREDmr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_TMM0); // has SIB -// TODO: enforce that all registers must be different -//TEST("", TDPBUUDrrr, 0, FE_TMM0, FE_TMM0, FE_TMM2"); -//TEST("", TDPBUUDrrr, 0, FE_TMM2, FE_TMM0, FE_TMM2"); -//TEST("", TDPBUUDrrr, 0, FE_TMM1, FE_TMM2, FE_TMM2"); -TEST("\xc4\xe2\x6a\x5c\xc8", TDPBF16PSrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x6b\x5c\xc8", TDPFP16PSrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x68\x5e\xc8", TDPBUUDrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x69\x5e\xc8", TDPBUSDrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x6a\x5e\xc8", TDPBSUDrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x6b\x5e\xc8", TDPBSSDrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x68\x6c\xc8", TCMMRLFP16PSrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); -TEST("\xc4\xe2\x69\x6c\xc8", TCMMIMFP16PSrrr, 0, FE_TMM1, FE_TMM0, FE_TMM2); - -// Test LOCK prefix -TEST("\xf0\x87\x08", LOCK_XCHG32mr, 0, FE_MEM(FE_AX, 0, FE_NOREG, 0), FE_CX); -TEST("\xf0\x0f\xc1\x01", LOCK_XADD32mr, 0, FE_MEM(FE_CX, 0, FE_NOREG, 0), FE_AX); - -// Test long instructions -TEST("\x64\x67\xf0\x41\x81\x84\x00\x00\xff\xff\xff\x78\x56\x34\x12", LOCK_ADD32mi, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_R8, 1, FE_AX, -0x100), 0x12345678); -TEST("\x64\xf0\x66\x41\x81\x84\x00\x00\xff\xff\xff\x34\x12", LOCK_ADD16mi, FE_SEG(FE_FS), FE_MEM(FE_R8, 1, FE_AX, -0x100), 0x1234); -TEST("\x64\x67\xf0\x41\x0f\xba\xac\x00\x00\xff\xff\xff\x78", LOCK_BTS32mi, FE_ADDR32|FE_SEG(FE_FS), FE_MEM(FE_R8, 1, FE_AX, -0x100), 0x78); - -// PBNDKB -TEST("\x0f\x01\xc7", PBNDKB, 0); - -// SM4 -TEST("\xc4\xe2\x6a\xda\xc1", VSM4KEY4_128rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6e\x00\xda\xc1", VSM4KEY4_128rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); -TEST("\xc4\xe2\x6e\xda\xc1", VSM4KEY4_256rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6e\x20\xda\xc1", VSM4KEY4_256rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); -TEST("\x62\xf2\x6e\x48\xda\xc1", VSM4KEY4_512rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6e\x40\xda\xc1", VSM4KEY4_512rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); -TEST("\xc4\xe2\x6b\xda\xc1", VSM4RNDS4_128rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6f\x00\xda\xc1", VSM4RNDS4_128rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); -TEST("\xc4\xe2\x6f\xda\xc1", VSM4RNDS4_256rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6f\x20\xda\xc1", VSM4RNDS4_256rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); -TEST("\x62\xf2\x6f\x48\xda\xc1", VSM4RNDS4_512rrr, 0, FE_XMM0, FE_XMM2, FE_XMM1); -TEST("\x62\xf2\x6f\x40\xda\xc1", VSM4RNDS4_512rrr, 0, FE_XMM0, FE_XMM18, FE_XMM1); diff --git a/third_party/fadec/encode.c b/third_party/fadec/encode.c deleted file mode 100644 index abc57b0..0000000 --- a/third_party/fadec/encode.c +++ /dev/null @@ -1,460 +0,0 @@ - -#include -#include -#include - -#include - - -#ifdef __GNUC__ -#define LIKELY(x) __builtin_expect((x), 1) -#define UNLIKELY(x) __builtin_expect((x), 0) -#else -#define LIKELY(x) (x) -#define UNLIKELY(x) (x) -#endif - -#define OPC_66 0x80000 -#define OPC_F2 0x100000 -#define OPC_F3 0x200000 -#define OPC_REXW 0x400000 -#define OPC_LOCK 0x800000 -#define OPC_VEXL0 0x1000000 -#define OPC_VEXL1 0x1800000 -#define OPC_EVEXL0 0x2000000 -#define OPC_EVEXL1 0x2800000 -#define OPC_EVEXL2 0x3000000 -#define OPC_EVEXL3 0x3800000 -#define OPC_EVEXB 0x4000000 -#define OPC_VSIB 0x8000000 -#define OPC_67 FE_ADDR32 -#define OPC_SEG_MSK 0xe0000000 -#define OPC_JMPL FE_JMPL -#define OPC_MASK_MSK 0xe00000000 -#define OPC_EVEXZ 0x1000000000 -#define OPC_USER_MSK (OPC_67|OPC_SEG_MSK|OPC_MASK_MSK) -#define OPC_FORCE_SIB 0x2000000000 -#define OPC_DOWNGRADE_VEX 0x4000000000 -#define OPC_DOWNGRADE_VEX_FLIPW 0x40000000000 -#define OPC_EVEX_DISP8SCALE 0x38000000000 -#define OPC_GPH_OP0 0x200000000000 -#define OPC_GPH_OP1 0x400000000000 - -#define EPFX_REX_MSK 0x43f -#define EPFX_REX 0x20 -#define EPFX_EVEX 0x40 -#define EPFX_REXR 0x10 -#define EPFX_REXX 0x08 -#define EPFX_REXB 0x04 -#define EPFX_REXR4 0x02 -#define EPFX_REXB4 0x01 -#define EPFX_REXX4 0x400 -#define EPFX_VVVV_IDX 11 - -static bool op_mem(FeOp op) { return op < 0; } -static bool op_reg(FeOp op) { return op >= 0; } -static bool op_reg_gpl(FeOp op) { return (op & ~0x1f) == 0x100; } -static bool op_reg_gph(FeOp op) { return (op & ~0x3) == 0x204; } -static bool op_reg_xmm(FeOp op) { return (op & ~0x1f) == 0x600; } -static int64_t op_mem_offset(FeOp op) { return (int32_t) op; } -static unsigned op_mem_base(FeOp op) { return (op >> 32) & 0xfff; } -static unsigned op_mem_idx(FeOp op) { return (op >> 44) & 0xfff; } -static unsigned op_mem_scale(FeOp op) { return (op >> 56) & 0xf; } -static unsigned op_reg_idx(FeOp op) { return op & 0xff; } -static bool op_imm_n(FeOp imm, unsigned immsz) { - if (immsz == 0 && !imm) return true; - if (immsz == 1 && (int8_t) imm == imm) return true; - if (immsz == 2 && (int16_t) imm == imm) return true; - if (immsz == 3 && (imm&0xffffff) == imm) return true; - if (immsz == 4 && (int32_t) imm == imm) return true; - if (immsz == 8 && (int64_t) imm == imm) return true; - return false; -} - -static -unsigned -opc_size(uint64_t opc, uint64_t epfx) -{ - unsigned res = 1; - if (UNLIKELY(opc & OPC_EVEXL0)) { - res += 4; - } else if (UNLIKELY(opc & OPC_VEXL0)) { - if (opc & (OPC_REXW|0x20000) || epfx & (EPFX_REXX|EPFX_REXB)) - res += 3; - else - res += 2; - } else { - if (opc & OPC_LOCK) res++; - if (opc & OPC_66) res++; - if (opc & (OPC_F2|OPC_F3)) res++; - if (opc & OPC_REXW || epfx & EPFX_REX_MSK) res++; - if (opc & 0x30000) res++; - if (opc & 0x20000) res++; - } - if (opc & OPC_SEG_MSK) res++; - if (opc & OPC_67) res++; - if (opc & 0x8000) res++; - return res; -} - -static -int -enc_opc(uint8_t** restrict buf, uint64_t opc, uint64_t epfx) -{ - if (opc & OPC_SEG_MSK) - *(*buf)++ = (0x65643e362e2600 >> (8 * ((opc >> 29) & 7))) & 0xff; - if (opc & OPC_67) *(*buf)++ = 0x67; - if (opc & OPC_EVEXL0) { - *(*buf)++ = 0x62; - unsigned b1 = opc >> 16 & 7; - if (!(epfx & EPFX_REXR)) b1 |= 0x80; - if (!(epfx & EPFX_REXX)) b1 |= 0x40; - if (!(epfx & EPFX_REXB)) b1 |= 0x20; - if (!(epfx & EPFX_REXR4)) b1 |= 0x10; - if ((epfx & EPFX_REXB4)) b1 |= 0x08; - *(*buf)++ = b1; - unsigned b2 = opc >> 20 & 3; - if (!(epfx & EPFX_REXX4)) b2 |= 0x04; - b2 |= (~(epfx >> EPFX_VVVV_IDX) & 0xf) << 3; - if (opc & OPC_REXW) b2 |= 0x80; - *(*buf)++ = b2; - unsigned b3 = opc >> 33 & 7; - b3 |= (~(epfx >> EPFX_VVVV_IDX) & 0x10) >> 1; - if (opc & OPC_EVEXB) b3 |= 0x10; - b3 |= (opc >> 23 & 3) << 5; - if (opc & OPC_EVEXZ) b3 |= 0x80; - *(*buf)++ = b3; - } else if (opc & OPC_VEXL0) { - if (epfx & (EPFX_REXR4|EPFX_REXX4|EPFX_REXB4|(0x10<> 20 & 3; - *(*buf)++ = 0xc4 | !vex3; - unsigned b2 = pp | (opc & 0x800000 ? 0x4 : 0); - if (vex3) { - unsigned b1 = opc >> 16 & 7; - if (!(epfx & EPFX_REXR)) b1 |= 0x80; - if (!(epfx & EPFX_REXX)) b1 |= 0x40; - if (!(epfx & EPFX_REXB)) b1 |= 0x20; - *(*buf)++ = b1; - if (opc & OPC_REXW) b2 |= 0x80; - } else { - if (!(epfx & EPFX_REXR)) b2 |= 0x80; - } - b2 |= (~(epfx >> EPFX_VVVV_IDX) & 0xf) << 3; - *(*buf)++ = b2; - } else { - if (opc & OPC_LOCK) *(*buf)++ = 0xF0; - if (opc & OPC_66) *(*buf)++ = 0x66; - if (opc & OPC_F2) *(*buf)++ = 0xF2; - if (opc & OPC_F3) *(*buf)++ = 0xF3; - if (opc & OPC_REXW || epfx & (EPFX_REX_MSK)) { - unsigned rex = 0x40; - if (opc & OPC_REXW) rex |= 8; - if (epfx & EPFX_REXR) rex |= 4; - if (epfx & EPFX_REXX) rex |= 2; - if (epfx & EPFX_REXB) rex |= 1; - *(*buf)++ = rex; - } - if (opc & 0x30000) *(*buf)++ = 0x0F; - if ((opc & 0x30000) == 0x20000) *(*buf)++ = 0x38; - if ((opc & 0x30000) == 0x30000) *(*buf)++ = 0x3A; - } - *(*buf)++ = opc & 0xff; - if (opc & 0x8000) *(*buf)++ = (opc >> 8) & 0xff; - return 0; -} - -static -int -enc_imm(uint8_t** restrict buf, uint64_t imm, unsigned immsz) -{ - if (!op_imm_n(imm, immsz)) return -1; - for (unsigned i = 0; i < immsz; i++) - *(*buf)++ = imm >> 8 * i; - return 0; -} - -static -int -enc_o(uint8_t** restrict buf, uint64_t opc, uint64_t epfx, uint64_t op0) -{ - if (op_reg_idx(op0) & 0x8) epfx |= EPFX_REXB; - - // NB: this cannot happen. There is only one O-encoded instruction which - // accepts high-byte registers (b0+/MOVABS Rb,Ib), which will never have a - // REx prefix if the operand is a high-byte register. - // bool has_rex = opc & OPC_REXW || epfx & EPFX_REX_MSK; - // if (has_rex && op_reg_gph(op0)) return -1; - - if (enc_opc(buf, opc, epfx)) return -1; - *(*buf - 1) = (*(*buf - 1) & 0xf8) | (op_reg_idx(op0) & 0x7); - return 0; -} - -static -int -enc_mr(uint8_t** restrict buf, uint64_t opc, uint64_t epfx, uint64_t op0, - uint64_t op1, unsigned immsz) -{ - // If !op_reg(op1), it is a constant value for ModRM.reg - if (op_reg(op0) && (op_reg_idx(op0) & 0x8)) epfx |= EPFX_REXB; - if (op_reg(op0) && (op_reg_idx(op0) & 0x10)) - epfx |= 0 ? EPFX_REXB4 : EPFX_REXX|EPFX_EVEX; - if (op_mem(op0) && (op_mem_base(op0) & 0x8)) epfx |= EPFX_REXB; - if (op_mem(op0) && (op_mem_base(op0) & 0x10)) epfx |= EPFX_REXB4; - if (op_mem(op0) && (op_mem_idx(op0) & 0x8)) epfx |= EPFX_REXX; - if (op_mem(op0) && (op_mem_idx(op0) & 0x10)) - epfx |= opc & OPC_VSIB ? 0x10<> 39; - if (!(off & ((1 << disp8scale) - 1)) && op_imm_n(off >> disp8scale, 1)) { - mod = 0x40; - dispsz = 1; - off >>= disp8scale; - } else { - mod = 0x80; - dispsz = 4; - } - } else if (rm == 5) { - mod = 0x40; - dispsz = 1; - } - } - - if (opcsz + 1 + (rm == 4) + dispsz + immsz > 15) return -1; - - if (enc_opc(buf, opc, epfx)) return -1; - *(*buf)++ = mod | (reg << 3) | rm; - if (UNLIKELY(rm == 4)) - *(*buf)++ = (scale << 6) | (idx << 3) | base; - return enc_imm(buf, off, dispsz); -} - -typedef enum { - ENC_NP, ENC_M, ENC_R, ENC_M1, ENC_MC, ENC_MR, ENC_RM, ENC_RMA, ENC_MRC, - ENC_AM, ENC_MA, ENC_I, ENC_O, ENC_OA, ENC_S, ENC_A, ENC_D, ENC_FD, ENC_TD, - ENC_IM, - ENC_RVM, ENC_RVMR, ENC_RMV, ENC_VM, ENC_MVR, ENC_MRV, - ENC_MAX -} Encoding; - -struct EncodingInfo { - uint8_t modrm : 2; - uint8_t modreg : 2; - uint8_t vexreg : 2; - uint8_t immidx : 2; - // 0 = normal or jump, 1 = constant 1, 2 = address-size, 3 = RVMR - uint8_t immctl : 3; - uint8_t zregidx : 2; - uint8_t zregval : 1; -}; - -const struct EncodingInfo encoding_infos[ENC_MAX] = { - [ENC_NP] = { 0 }, - [ENC_M] = { .modrm = 0x0^3, .immidx = 1 }, - [ENC_R] = { .modreg = 0x0^3 }, - [ENC_M1] = { .modrm = 0x0^3, .immctl = 1, .immidx = 1 }, - [ENC_MC] = { .modrm = 0x0^3, .zregidx = 0x1^3, .zregval = 1 }, - [ENC_MR] = { .modrm = 0x0^3, .modreg = 0x1^3, .immidx = 2 }, - [ENC_RM] = { .modrm = 0x1^3, .modreg = 0x0^3, .immidx = 2 }, - [ENC_RMA] = { .modrm = 0x1^3, .modreg = 0x0^3, .zregidx = 0x2^3, .zregval = 0 }, - [ENC_MRC] = { .modrm = 0x0^3, .modreg = 0x1^3, .zregidx = 0x2^3, .zregval = 1 }, - [ENC_AM] = { .modrm = 0x1^3, .zregidx = 0x0^3, .zregval = 0 }, - [ENC_MA] = { .modrm = 0x0^3, .zregidx = 0x1^3, .zregval = 0 }, - [ENC_I] = { .immidx = 0 }, - [ENC_O] = { .modreg = 0x0^3, .immidx = 1 }, - [ENC_OA] = { .modreg = 0x0^3, .zregidx = 0x1^3, .zregval = 0 }, - [ENC_S] = { 0 }, - [ENC_A] = { .zregidx = 0x0^3, .zregval = 0, .immidx = 1 }, - [ENC_D] = { .immidx = 0 }, - [ENC_FD] = { .zregidx = 0x0^3, .zregval = 0, .immctl = 2, .immidx = 1 }, - [ENC_TD] = { .zregidx = 0x1^3, .zregval = 0, .immctl = 2, .immidx = 0 }, - [ENC_IM] = { .modrm = 0x1^3, .immidx = 0 }, - [ENC_RVM] = { .modrm = 0x2^3, .modreg = 0x0^3, .vexreg = 0x1^3, .immidx = 3 }, - [ENC_RVMR] = { .modrm = 0x2^3, .modreg = 0x0^3, .vexreg = 0x1^3, .immctl = 3, .immidx = 3 }, - [ENC_RMV] = { .modrm = 0x1^3, .modreg = 0x0^3, .vexreg = 0x2^3 }, - [ENC_VM] = { .modrm = 0x1^3, .vexreg = 0x0^3, .immidx = 2 }, - [ENC_MVR] = { .modrm = 0x0^3, .modreg = 0x2^3, .vexreg = 0x1^3 }, - [ENC_MRV] = { .modrm = 0x0^3, .modreg = 0x1^3, .vexreg = 0x2^3 }, -}; - -static const uint64_t alt_tab[] = { -#include -}; - -int -fe_enc64_impl(uint8_t** restrict buf, uint64_t opc, FeOp op0, FeOp op1, - FeOp op2, FeOp op3) -{ - uint8_t* buf_start = *buf; - uint64_t ops[4] = {op0, op1, op2, op3}; - - uint64_t epfx = 0; - // Doesn't change between variants - if ((opc & OPC_GPH_OP0) && op_reg_gpl(op0) && op0 >= FE_SP) - epfx |= EPFX_REX; - else if (!(opc & OPC_GPH_OP0) && op_reg_gph(op0)) - goto fail; - if ((opc & OPC_GPH_OP1) && op_reg_gpl(op1) && op1 >= FE_SP) - epfx |= EPFX_REX; - else if (!(opc & OPC_GPH_OP1) && op_reg_gph(op1)) - goto fail; - -try_encode:; - unsigned enc = (opc >> 51) & 0x1f; - const struct EncodingInfo* ei = &encoding_infos[enc]; - - int64_t imm = 0xcc; - unsigned immsz = (opc >> 47) & 0xf; - - if (UNLIKELY(ei->zregidx && op_reg_idx(ops[ei->zregidx^3]) != ei->zregval)) - goto next; - - if (UNLIKELY(enc == ENC_S)) { - if ((op_reg_idx(op0) << 3 & 0x20) != (opc & 0x20)) goto next; - opc |= op_reg_idx(op0) << 3; - } - - if (immsz) { - imm = ops[ei->immidx]; - if (UNLIKELY(ei->immctl)) { - if (ei->immctl == 2) { - immsz = UNLIKELY(opc & OPC_67) ? 4 : 8; - if (immsz == 4) imm = (int32_t) imm; // address are zero-extended - } else if (ei->immctl == 3) { - if (!op_reg_xmm(imm)) goto fail; - imm = op_reg_idx(imm) << 4; - if (!op_imm_n(imm, 1)) goto fail; - } else if (ei->immctl == 1) { - if (imm != 1) goto next; - immsz = 0; - } - } else if (enc == ENC_D) { - imm -= (int64_t) *buf + opc_size(opc, epfx) + immsz; - bool has_alt = opc >> 56 != 0; - bool skip_to_alt = has_alt && UNLIKELY(opc & FE_JMPL); - if (skip_to_alt || !op_imm_n(imm, immsz)) { - if (!has_alt) goto fail; - // JMP/Jcc special case - immsz = 4; - if (opc & 0x80) { // JMP - opc -= 2; // Convert opcode 0xeb to 0xe9 - imm -= 3; // 3 extra immediate bytes - } else { // Jcc - opc += 0x10010; // Add 0f escape + 0x10 to opcode - imm -= 4; // 0f escape + 3 extra immediate bytes - } - if (!op_imm_n(imm, immsz)) goto fail; - } - } else { - if (!op_imm_n(imm, immsz)) goto next; - } - } - - // NOP has no operands, so this must be the 32-bit OA XCHG - if ((opc & 0xfffffff) == 0x90 && ops[0] == FE_AX) goto next; - - if (UNLIKELY(enc == ENC_R)) { - if (enc_mr(buf, opc, epfx, 0, ops[0], immsz)) goto fail; - } else if (ei->modrm) { - FeOp modreg = ei->modreg ? ops[ei->modreg^3] : (opc & 0xff00) >> 8; - if (ei->vexreg) - epfx |= ((uint64_t) op_reg_idx(ops[ei->vexreg^3])) << EPFX_VVVV_IDX; - // Can fail for upgrade to EVEX due to high register numbers - if (enc_mr(buf, opc, epfx, ops[ei->modrm^3], modreg, immsz)) goto next; - } else if (ei->modreg) { - if (enc_o(buf, opc, epfx, ops[ei->modreg^3])) goto fail; - } else { - if (enc_opc(buf, opc, epfx)) goto fail; - } - - if (immsz) - if (enc_imm(buf, imm, immsz)) goto fail; - - return 0; - -next:; - uint64_t alt = opc >> 56; - if (alt) { // try alternative encoding, if available - opc = alt_tab[alt] | (opc & OPC_USER_MSK); - goto try_encode; - } - -fail: - // Don't advance buffer on error; though we shouldn't write anything. - *buf = buf_start; - return -1; -} diff --git a/third_party/fadec/encode2-test.c b/third_party/fadec/encode2-test.c deleted file mode 100644 index c807f47..0000000 --- a/third_party/fadec/encode2-test.c +++ /dev/null @@ -1,64 +0,0 @@ - -#include -#include -#include -#include - -#include - - -static -void print_hex(const uint8_t* buf, size_t len) { - for (size_t i = 0; i < len; i++) - printf("%02x", buf[i]); -} - -static int -check(const uint8_t* buf, const void* exp, size_t exp_len, unsigned res, const char* name) { - if (res == exp_len && !memcmp(buf, exp, exp_len)) - return 0; - printf("Failed case (new) %s:\n", name); - printf(" Exp (%2zu): ", exp_len); - print_hex((const uint8_t*)exp, exp_len); - printf("\n Got (%2u): ", res); - print_hex(buf, res); - printf("\n"); - return -1; -} - -#define TEST1(str, exp, name, ...) do { \ - memset(buf, 0, sizeof buf); \ - unsigned res = fe64_ ## name(buf, __VA_ARGS__); \ - failed |= check(buf, exp, sizeof(exp) - 1, res, str); \ - } while (0) -#define TEST(exp, ...) TEST1(#__VA_ARGS__, exp, __VA_ARGS__) - -int -main(void) { - int failed = 0; - uint8_t buf[16]; - - // This API is type safe and prohibits compilation of reg-type mismatches -#define ENC_TEST_TYPESAFE - // Silence -Warray-bounds with double cast -#define FE_PTR(off) (const void*) ((uintptr_t) buf + (off)) -#define FLAGMASK(flags, mask) flags, mask -#include "encode-test.inc" - - TEST("\x90", NOP, 0); - TEST("\x90", NOP, 1); - TEST("\x66\x90", NOP, 2); - TEST("\x0f\x1f\x00", NOP, 3); - TEST("\x0f\x1f\x40\x00", NOP, 4); - TEST("\x0f\x1f\x44\x00\x00", NOP, 5); - TEST("\x66\x0f\x1f\x44\x00\x00", NOP, 6); - TEST("\x0f\x1f\x80\x00\x00\x00\x00", NOP, 7); - TEST("\x0f\x1f\x84\x00\x00\x00\x00\x00", NOP, 8); - TEST("\x66\x0f\x1f\x84\x00\x00\x00\x00\x00", NOP, 9); - TEST("\x66\x0f\x1f\x84\x00\x00\x00\x00\x00\x90", NOP, 10); - TEST("\x66\x0f\x1f\x84\x00\x00\x00\x00\x00\x66\x90", NOP, 11); - TEST("\x66\x0f\x1f\x84\x00\x00\x00\x00\x00\x0f\x1f\x00", NOP, 12); - - puts(failed ? "Some tests FAILED" : "All tests PASSED"); - return failed ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/third_party/fadec/encode2-test.cc b/third_party/fadec/encode2-test.cc deleted file mode 100644 index 78005f2..0000000 --- a/third_party/fadec/encode2-test.cc +++ /dev/null @@ -1,64 +0,0 @@ - -#include -#include -#include -#include - -#include - - -using Buffer = std::array; - -static -void print_hex(const uint8_t* buf, size_t len) { - for (size_t i = 0; i < len; i++) - std::printf("%02x", buf[i]); -} - -static int -check(const Buffer& buf, const char* exp, size_t exp_len, unsigned res, const char* name) { - if (res == exp_len && !std::memcmp(buf.data(), exp, exp_len)) - return 0; - std::printf("Failed case (new) %s:\n", name); - std::printf(" Exp (%2zu): ", exp_len); - print_hex(reinterpret_cast(exp), exp_len); - std::printf("\n Got (%2u): ", res); - print_hex(buf.data(), res); - std::printf("\n"); - return -1; -} - -#define TEST1(str, exp, name, ...) do { \ - buf.fill(0); \ - unsigned res = fe64_ ## name(buf.data(), __VA_ARGS__); \ - failed |= check(buf, exp, sizeof(exp) - 1, res, str); \ - } while (0) -#define TEST(exp, ...) TEST1(#__VA_ARGS__, exp, __VA_ARGS__) - -#define TEST_CPP1(str, exp, expr) do { \ - buf.fill(0); \ - unsigned res = (expr); \ - failed |= check(buf, exp, sizeof(exp) - 1, res, str); \ - } while (0) -#define TEST_CPP(exp, ...) TEST_CPP1(#__VA_ARGS__, exp, __VA_ARGS__) - -int main() { - int failed = 0; - Buffer buf{}; - - // This API is type safe and prohibits compilation of reg-type mismatches -#define ENC_TEST_TYPESAFE - // Silence -Warray-bounds with double cast -#define FE_PTR(off) (const void*) ((uintptr_t) buf.data() + (off)) -#define FLAGMASK(flags, mask) flags, mask -#include "encode-test.inc" - - // Test implicit conversion of parameters also on the actual functions - TEST_CPP("\x0f\x90\xc0", fe64_SETO8r(buf.data(), 0, FE_AX)); - TEST_CPP("\x0f\x90\xc0", (fe64_SETO8r)(buf.data(), 0, FE_AX)); - TEST_CPP("\x0f\x90\xc4", fe64_SETO8r(buf.data(), 0, FE_AH)); - TEST_CPP("\x0f\x90\xc4", (fe64_SETO8r)(buf.data(), 0, FE_AH)); - - std::puts(failed ? "Some tests FAILED" : "All tests PASSED"); - return failed ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/third_party/fadec/encode2.c b/third_party/fadec/encode2.c deleted file mode 100644 index 0a318c8..0000000 --- a/third_party/fadec/encode2.c +++ /dev/null @@ -1,345 +0,0 @@ - -#include -#include -#include - -#include - - -#ifdef __GNUC__ -#define LIKELY(x) __builtin_expect(!!(x), 1) -#define UNLIKELY(x) __builtin_expect(!!(x), 0) -#if __has_attribute(cold) && __has_attribute(preserve_most) -#define HINT_COLD __attribute__((cold,preserve_most,noinline)) -#elif __has_attribute(cold) -#define HINT_COLD __attribute__((cold,noinline)) -#else -#define HINT_COLD -#endif -#else -#define LIKELY(x) (x) -#define UNLIKELY(x) (x) -#define HINT_COLD -#endif - -#define op_reg_idx(op) (op).idx -#define op_reg_gph(op) (((op).idx & ~0x3) == 0x24) -#define op_mem_base(mem) op_reg_idx((mem).base) -#define op_mem_idx(mem) op_reg_idx((mem).idx) - -static bool -op_imm_n(int64_t imm, unsigned immsz) { - if (immsz == 0 && !imm) return true; - if (immsz == 1 && (int8_t) imm == imm) return true; - if (immsz == 2 && (int16_t) imm == imm) return true; - if (immsz == 3 && (imm&0xffffff) == imm) return true; - if (immsz == 4 && (int32_t) imm == imm) return true; - if (immsz == 8 && (int64_t) imm == imm) return true; - return false; -} - -HINT_COLD static unsigned -enc_seg67(uint8_t* buf, unsigned flags) { - unsigned idx = 0; - if (UNLIKELY(flags & FE_SEG_MASK)) { - unsigned seg = (0x65643e362e2600 >> (8 * (flags & FE_SEG_MASK))) & 0xff; - buf[idx++] = seg; - } - if (UNLIKELY(flags & FE_ADDR32)) buf[idx++] = 0x67; - return idx; -} - -static unsigned -enc_rex_mem(FeMem op0, uint64_t op1) { - // Essentially just an and+or due to struct layout. - uint32_t val = op1 | op0.flags | (op_mem_base(op0) << 8) | - ((uint32_t)op_mem_idx(op0) << 24); - // Combine REX.RXB using multiplication for branch-less code. - uint32_t masked = val & 0x08000808; - return masked ? (uint8_t) (masked * (1|(1<<15)|(1<<25)) >> 26) + 0x40 : 0; -} - -static void -enc_imm(uint8_t* buf, uint64_t imm, unsigned immsz) { -#ifdef __GNUC__ - // Clang doesn't fold the loop into a single store. - // See: https://github.com/llvm/llvm-project/issues/154696 - if (__builtin_constant_p(immsz)) { - __builtin_memcpy(buf, &imm, immsz); - return; - } -#endif - for (unsigned i = 0; i < immsz; i++) - *buf++ = imm >> 8 * i; -} - -static int -enc_mem_common(uint8_t* buf, unsigned ripoff, FeMem op0, uint64_t op1, - unsigned disp8scale) { - int mod = 0, reg = op1 & 7, rm; - unsigned sib = 0x20; - bool withsib = false; - unsigned dispsz = 0; - int32_t off = op0.off; - - if (op_reg_idx(op0.idx) < 0x80) { - int scalabs = op0.scale; - if (UNLIKELY((unsigned) (op0.scale - 1) >= 8 || - (op0.scale & (op0.scale - 1)))) - return 0; - unsigned scale = (scalabs & 0xA ? 1 : 0) | (scalabs & 0xC ? 2 : 0); - sib = scale << 6 | (op_reg_idx(op0.idx) & 7) << 3; - withsib = true; - } else if (UNLIKELY(op0.scale != 0)) { - return 0; - } - - if (UNLIKELY(op0.base.idx >= 0x20)) { - if (UNLIKELY(op0.base.idx >= op_reg_idx(FE_NOREG))) { - *buf++ = (reg << 3) | 4; - *buf++ = sib | 5; - enc_imm(buf, off, 4); - return ripoff + 6; - } else if (LIKELY(op0.base.idx == FE_IP.idx)) { - if (withsib) - return 0; - *buf++ = (reg << 3) | 5; - // Adjust offset, caller doesn't know instruction length. - enc_imm(buf, off - ripoff - 5, 4); - return ripoff + 5; - } else { - return 0; - } - } - - rm = op_reg_idx(op0.base) & 7; - - if (off) { - if (LIKELY(!disp8scale)) { - mod = (int8_t) off == off ? 0x40 : 0x80; - dispsz = (int8_t) off == off ? 1 : 4; - } else { - if (!(off & ((1 << disp8scale) - 1)) && op_imm_n(off >> disp8scale, 1)) - off >>= disp8scale, mod = 0x40, dispsz = 1; - else - mod = 0x80, dispsz = 4; - } - } else if (rm == 5) { - dispsz = 1; - mod = 0x40; - } - - // Always write four bytes of displacement. The buffer is always large - // enough, and we truncate by returning a smaller "written bytes" count. - if (withsib || rm == 4) { - *buf++ = mod | (reg << 3) | 4; - *buf++ = sib | rm; - enc_imm(buf, off, 4); - return ripoff + 2 + dispsz; - } else { - *buf++ = mod | (reg << 3) | rm; - enc_imm(buf, off, 4); - return ripoff + 1 + dispsz; - } -} - -static int -enc_mem(uint8_t* buf, unsigned ripoff, FeMem op0, uint64_t op1, bool forcesib, - unsigned disp8scale) { - if (UNLIKELY(op_reg_idx(op0.idx) == 4)) - return 0; - if (forcesib && op_reg_idx(op0.idx) == op_reg_idx(FE_NOREG)) { - op0.scale = 1; - op0.idx = FE_GP(4); - } - return enc_mem_common(buf, ripoff, op0, op1, disp8scale); -} - -static int -enc_mem_vsib(uint8_t* buf, unsigned ripoff, FeMemV op0, uint64_t op1, - bool forcesib, unsigned disp8scale) { - (void) forcesib; - FeMem mem = FE_MEM(op0.base, op0.scale, FE_GP(op_reg_idx(op0.idx)), op0.off); - return enc_mem_common(buf, ripoff, mem, op1, disp8scale); -} - -// EVEX/VEX "Opcode" format: -// -// | EVEX byte 4 | P P M M M - - W | Opcode byte | VEX-D VEX-D-FLIPW -// 0 8 16 24 - -enum { - FE_OPC_VEX_WPP_SHIFT = 8, - FE_OPC_VEX_WPP_MASK = 0x83 << FE_OPC_VEX_WPP_SHIFT, - FE_OPC_VEX_MMM_SHIFT = 10, - FE_OPC_VEX_MMM_MASK = 0x1f << FE_OPC_VEX_MMM_SHIFT, - FE_OPC_VEX_DOWNGRADE_VEX = 1 << 24, - FE_OPC_VEX_DOWNGRADE_VEX_FLIPW = 1 << 25, -}; - -static int -enc_vex_common(uint8_t* buf, unsigned opcode, unsigned base, - unsigned idx, unsigned reg, unsigned vvvv) { - if ((base | idx | reg | vvvv) & 0x10) return 0; - bool vex3 = ((base | idx) & 0x08) || (opcode & 0xfc00) != 0x0400; - if (vex3) { - *buf++ = 0xc4; - unsigned b1 = (opcode & FE_OPC_VEX_MMM_MASK) >> FE_OPC_VEX_MMM_SHIFT; - if (!(reg & 0x08)) b1 |= 0x80; - if (!(idx & 0x08)) b1 |= 0x40; - if (!(base & 0x08)) b1 |= 0x20; - *buf++ = b1; - unsigned b2 = (opcode & FE_OPC_VEX_WPP_MASK) >> FE_OPC_VEX_WPP_SHIFT; - if (opcode & 0x20) b2 |= 0x04; - b2 |= (vvvv ^ 0xf) << 3; - *buf++ = b2; - } else { - *buf++ = 0xc5; - unsigned b2 = opcode >> FE_OPC_VEX_WPP_SHIFT & 3; - if (opcode & 0x20) b2 |= 0x04; - if (!(reg & 0x08)) b2 |= 0x80; - b2 |= (vvvv ^ 0xf) << 3; - *buf++ = b2; - } - *buf++ = (opcode & 0xff0000) >> 16; - return 3 + vex3; -} - -static int -enc_vex_reg(uint8_t* buf, unsigned opcode, uint64_t rm, uint64_t reg, - uint64_t vvvv) { - unsigned off = enc_vex_common(buf, opcode, rm, 0, reg, vvvv); - buf[off] = 0xc0 | (reg << 3 & 0x38) | (rm & 7); - return off ? off + 1 : 0; -} - -static int -enc_vex_mem(uint8_t* buf, unsigned opcode, FeMem rm, uint64_t reg, - uint64_t vvvv, unsigned ripoff, bool forcesib, unsigned disp8scale) { - unsigned off = enc_vex_common(buf, opcode, op_reg_idx(rm.base), op_reg_idx(rm.idx), reg, vvvv); - unsigned memoff = enc_mem(buf + off, ripoff + off, rm, reg, forcesib, disp8scale); - return off && memoff ? memoff : 0; -} - -static int -enc_vex_vsib(uint8_t* buf, unsigned opcode, FeMemV rm, uint64_t reg, - uint64_t vvvv, unsigned ripoff, bool forcesib, unsigned disp8scale) { - unsigned off = enc_vex_common(buf, opcode, op_reg_idx(rm.base), op_reg_idx(rm.idx), reg, vvvv); - unsigned memoff = enc_mem_vsib(buf + off, ripoff + off, rm, reg, forcesib, disp8scale); - return off && memoff ? memoff : 0; -} - -static int -enc_evex_common(uint8_t* buf, unsigned opcode, unsigned base, - unsigned idx, unsigned reg, unsigned vvvv) { - *buf++ = 0x62; - bool evexr3 = reg & 0x08; - bool evexr4 = reg & 0x10; - bool evexb3 = base & 0x08; - bool evexb4 = base & 0x10; // evexb4 is unused in AVX-512 encoding - bool evexx3 = idx & 0x08; - bool evexx4 = idx & 0x10; - bool evexv4 = vvvv & 0x10; - unsigned b1 = (opcode & FE_OPC_VEX_MMM_MASK) >> FE_OPC_VEX_MMM_SHIFT; - if (!evexr3) b1 |= 0x80; - if (!evexx3) b1 |= 0x40; - if (!evexb3) b1 |= 0x20; - if (!evexr4) b1 |= 0x10; - if (evexb4) b1 |= 0x08; - *buf++ = b1; - unsigned b2 = (opcode & FE_OPC_VEX_WPP_MASK) >> FE_OPC_VEX_WPP_SHIFT; - if (!evexx4) b2 |= 0x04; - b2 |= (~vvvv & 0xf) << 3; - *buf++ = b2; - unsigned b3 = opcode & 0xff; - if (!evexv4) b3 |= 0x08; - *buf++ = b3; - *buf++ = (opcode & 0xff0000) >> 16; - return 5; -} - -static unsigned -enc_evex_to_vex(unsigned opcode) { - return opcode & FE_OPC_VEX_DOWNGRADE_VEX_FLIPW ? opcode ^ 0x8000 : opcode; -} - -// Encode AVX-512 EVEX r/m-reg, non-xmm reg, vvvv, prefer vex -static int -enc_evex_reg(uint8_t* buf, unsigned opcode, unsigned rm, - unsigned reg, unsigned vvvv) { - unsigned off; - if (!((rm | reg | vvvv) & 0x10) && (opcode & FE_OPC_VEX_DOWNGRADE_VEX)) - off = enc_vex_common(buf, enc_evex_to_vex(opcode), rm, 0, reg, vvvv); - else - off = enc_evex_common(buf, opcode, rm, 0, reg, vvvv); - buf[off] = 0xc0 | (reg << 3 & 0x38) | (rm & 7); - return off + 1; -} - -// Encode AVX-512 EVEX r/m-reg, xmm reg, vvvv, prefer vex -static int -enc_evex_xmm(uint8_t* buf, unsigned opcode, unsigned rm, - unsigned reg, unsigned vvvv) { - unsigned off; - if (!((rm | reg | vvvv) & 0x10) && (opcode & FE_OPC_VEX_DOWNGRADE_VEX)) - off = enc_vex_common(buf, enc_evex_to_vex(opcode), rm, 0, reg, vvvv); - else - // AVX-512 XMM reg encoding uses X3 instead of B4. - off = enc_evex_common(buf, opcode, rm & 0x0f, rm >> 1, reg, vvvv); - buf[off] = 0xc0 | (reg << 3 & 0x38) | (rm & 7); - return off + 1; -} - -static int -enc_evex_mem(uint8_t* buf, unsigned opcode, FeMem rm, uint64_t reg, - uint64_t vvvv, unsigned ripoff, bool forcesib, unsigned disp8scale) { - unsigned off; - if (!((op_reg_idx(rm.base) | op_reg_idx(rm.idx) | reg | vvvv) & 0x10) && - (opcode & FE_OPC_VEX_DOWNGRADE_VEX)) { - disp8scale = 0; // Only AVX-512 EVEX compresses displacement - off = enc_vex_common(buf, enc_evex_to_vex(opcode), op_reg_idx(rm.base), op_reg_idx(rm.idx), reg, vvvv); - } else { - off = enc_evex_common(buf, opcode, op_reg_idx(rm.base), op_reg_idx(rm.idx), reg, vvvv); - } - unsigned memoff = enc_mem(buf + off, ripoff + off, rm, reg, forcesib, disp8scale); - return off && memoff ? memoff : 0; -} - -static int -enc_evex_vsib(uint8_t* buf, unsigned opcode, FeMemV rm, uint64_t reg, - uint64_t vvvv, unsigned ripoff, bool forcesib, unsigned disp8scale) { - (void) vvvv; - // EVEX VSIB requires non-zero mask operand - if (!(opcode & 0x7)) return 0; - // EVEX.X4 is encoded in EVEX.V4 - unsigned idx = op_reg_idx(rm.idx); - unsigned off = enc_evex_common(buf, opcode, op_reg_idx(rm.base), idx & 0x0f, reg, idx & 0x10); - unsigned memoff = enc_mem_vsib(buf + off, ripoff + off, rm, reg, forcesib, disp8scale); - return off && memoff ? memoff : 0; -} - -unsigned fe64_NOP(uint8_t* buf, unsigned flags) { - unsigned len = flags ? flags : 1; - // Taken from Intel SDM - static const uint8_t tbl[] = { - 0x90, - 0x66, 0x90, - 0x0f, 0x1f, 0x00, - 0x0f, 0x1f, 0x40, 0x00, - 0x0f, 0x1f, 0x44, 0x00, 0x00, - 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, - 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - unsigned remain = len; - for (; remain > 9; remain -= 9) - for (unsigned i = 0; i < 9; i++) - *(buf++) = tbl[36 + i]; - const uint8_t* src = tbl + (remain * (remain - 1)) / 2; - for (unsigned i = 0; i < remain; i++) - *(buf++) = src[i]; - return len; -} - -#include diff --git a/third_party/fadec/fadec-decode-private.inc b/third_party/fadec/fadec-decode-private.inc deleted file mode 100644 index b31fe90..0000000 --- a/third_party/fadec/fadec-decode-private.inc +++ /dev/null @@ -1,18 +0,0 @@ -// Auto-generated file -- do not modify! -#if defined(FD_DECODE_TABLE_DATA) -0x0004,0x0008,0x000c,0x0010,0x0014,0x0018,0x001c,0x0020,0x0024,0x0028,0x002c,0x0030,0x0034,0x0038,0x001c,0x0372,0x003c,0x0040,0x0044,0x0048,0x004c,0x0050,0x001c,0x0020,0x0054,0x0058,0x005c,0x0060,0x0064,0x0068,0x001c,0x0020,0x006c,0x0070,0x0074,0x0078,0x007c,0x0080,0xfff9,0x0084,0x0088,0x008c,0x0090,0x0094,0x0098,0x009c,0xfff9,0x00a0,0x00a4,0x00a8,0x00ac,0x00b0,0x00b4,0x00b8,0xfff9,0x00bc,0x00c0,0x00c4,0x00c8,0x00cc,0x00d0,0x00d4,0xfff9,0x00d8,0x00dc,0x00dc,0x00dc,0x00dc,0x00dc,0x00dc,0x00dc,0x00dc,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e0,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00ec,0x00f0,0x0202,0x00f8,0xfff9,0xfff9,0xfffa,0xfffb,0x0100,0x0104,0x0108,0x010c,0x0110,0x0114,0x0118,0x011c,0x0120,0x0124,0x0128,0x012c,0x0130,0x0134,0x0138,0x013c,0x0140,0x0144,0x0148,0x014c,0x0150,0x0154,0x0158,0x015c,0x0209,0x0219,0x0209,0x0229,0x01c0,0x01c4,0x01c8,0x01cc,0x01d0,0x01d4,0x01d8,0x01dc,0x0239,0x0249,0x0259,0x0269,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f4,0x01f8,0x01fc,0x0200,0x0204,0x0208,0x020c,0x0210,0x0214,0x0218,0x021c,0x0220,0x0224,0x0228,0x022c,0x0230,0x0234,0x0238,0x023c,0x0240,0x0244,0x0248,0x024c,0x0250,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0279,0x0289,0x0294,0x0298,0x029a,0x02a2,0x02a9,0x02c1,0x02b8,0x02bc,0x02c0,0x02c4,0x02c8,0x02cc,0x02d0,0x02d4,0x02f1,0x0301,0x0311,0x0321,0x0348,0x034c,0x0000,0x0350,0x20d1,0x20e1,0x2119,0x2131,0x2149,0x2159,0x2169,0x2181,0x0354,0x0358,0x035c,0x0360,0x0364,0x0368,0x036c,0x0370,0x0374,0x0378,0x037c,0x0380,0x0384,0x0388,0x038c,0x0390,0xfffc,0x0394,0xfffd,0xfffd,0x0398,0x039c,0x0331,0x0341,0x03d8,0x03dc,0x03e0,0x03e4,0x03e8,0x03ec,0x0351,0x0361,0x0004,0x0008,0x000c,0x0010,0x0014,0x0018,0x0000,0x0000,0x0024,0x0028,0x002c,0x0030,0x0034,0x0038,0x0000,0x048a,0x003c,0x0040,0x0044,0x0048,0x004c,0x0050,0x0000,0x0000,0x0054,0x0058,0x005c,0x0060,0x0064,0x0068,0x0000,0x0000,0x006c,0x0070,0x0074,0x0078,0x007c,0x0080,0xfff8,0x0000,0x0088,0x008c,0x0090,0x0094,0x0098,0x009c,0xfff8,0x0000,0x00a4,0x00a8,0x00ac,0x00b0,0x00b4,0x00b8,0xfff8,0x0000,0x00c0,0x00c4,0x00c8,0x00cc,0x00d0,0x00d4,0xfff8,0x0000,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0xfffe,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x00e8,0x0000,0x0000,0x248a,0x00fc,0xfff9,0xfff9,0xfffa,0xfffb,0x0100,0x0104,0x0108,0x010c,0x0110,0x0114,0x0118,0x011c,0x0120,0x0124,0x0128,0x012c,0x0130,0x0134,0x0138,0x013c,0x0140,0x0144,0x0148,0x014c,0x0150,0x0154,0x0158,0x015c,0x0209,0x0219,0x0000,0x0229,0x01c0,0x01c4,0x01c8,0x01cc,0x01d0,0x01d4,0x01d8,0x01dc,0x0239,0x0249,0x0259,0x0269,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f0,0x01f4,0x01f8,0x0000,0x0200,0x0204,0x0208,0x020c,0x0210,0x0214,0x0218,0x021c,0x0220,0x0224,0x0228,0x022c,0x0230,0x0234,0x0238,0x023c,0x0240,0x0244,0x0248,0x024c,0x0250,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0254,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0258,0x0279,0x0289,0x0294,0x0298,0x1126,0x1126,0x02a9,0x02d1,0x02b8,0x02bc,0x02c0,0x02c4,0x02c8,0x02cc,0x0000,0x02d4,0x02f1,0x0301,0x0311,0x0321,0x0000,0x0000,0x0000,0x0350,0x20d1,0x20e1,0x2119,0x2131,0x2149,0x2159,0x2169,0x2181,0x0354,0x0358,0x035c,0x0360,0x0364,0x0368,0x036c,0x0370,0x0374,0x0378,0x0000,0x0380,0x0384,0x0388,0x038c,0x0390,0xfffc,0x0394,0xfffd,0xfffd,0x0398,0x039c,0x0331,0x0341,0x03d8,0x03dc,0x03e0,0x03e4,0x03e8,0x03ec,0x0351,0x0361,0x00f4,0x2e3e,0x237e,0x2592,0x0000,0x45be,0x48a2,0x0000,0x0160,0x0160,0x0164,0x0164,0x0168,0x0168,0x016c,0x016c,0x0170,0x0170,0x0174,0x0174,0x0178,0x0178,0x017c,0x017c,0x0180,0x0180,0x0184,0x0184,0x0188,0x0188,0x018c,0x018c,0x0190,0x0190,0x0194,0x0194,0x0198,0x0198,0x019c,0x019c,0x01a0,0x01a0,0x01a4,0x01a4,0x01a8,0x01a8,0x01ac,0x01ac,0x01b0,0x01b0,0x01b4,0x01b4,0x01b8,0x01b8,0x01bc,0x01bc,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x0000,0x0000,0x0000,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e4,0x0000,0x01e8,0x01e8,0x0000,0x0000,0x01e8,0x01e8,0x01e8,0x01e8,0x01e8,0x01e8,0x01e8,0x01e8,0x0000,0x0000,0x0000,0x0000,0x01ec,0x01ec,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x025c,0x025c,0x0260,0x0260,0x0264,0x0264,0x0268,0x0268,0x026c,0x026c,0x0270,0x0270,0x026c,0x026c,0x0274,0x0274,0x0278,0x0278,0x027c,0x027c,0x0280,0x0280,0x0284,0x0284,0x0288,0x0288,0x028c,0x028c,0x0288,0x0288,0x0290,0x0290,0x029c,0x144a,0x101a,0x123e,0x0000,0x0000,0x0000,0x0000,0x02a0,0x144a,0x101a,0x123e,0x0000,0x0000,0x0000,0x0000,0x02a4,0x02a4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02b9,0x02a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02ac,0x02ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02e1,0x02ac,0x02ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02e9,0x02b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02b4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x02d8,0x02d8,0x02dc,0x02dc,0x02e0,0x02e0,0x02e4,0x02e4,0x02e8,0x02e8,0x02ec,0x02ec,0x02e8,0x02e8,0x02f0,0x02f0,0x02f4,0x02f4,0x02f8,0x02f8,0x02fc,0x02fc,0x0300,0x0300,0x0304,0x0304,0x0308,0x0308,0x0304,0x0304,0x030c,0x030c,0x0310,0x0310,0x0314,0x0314,0x0318,0x0318,0x031c,0x031c,0x0320,0x0320,0x0324,0x0324,0x0320,0x0320,0x0328,0x0328,0x032c,0x032c,0x0330,0x0330,0x0334,0x0334,0x0338,0x0338,0x033c,0x033c,0x0340,0x0340,0x033c,0x033c,0x0344,0x0344,0x03a0,0x03a0,0x03a0,0x03a0,0x03a4,0x03a4,0x03a8,0x03a8,0x03ac,0x03ac,0x03b0,0x03b0,0x03b4,0x03b4,0x03b8,0x03b8,0x03bc,0x03bc,0x03bc,0x03bc,0x03c0,0x03c0,0x03c4,0x03c4,0x03c8,0x03c8,0x03cc,0x03cc,0x03d0,0x03d0,0x03d4,0x03d4,0x03f0,0x03f0,0x03f4,0x03f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03f8,0x03f8,0x03fc,0x03fc,0x0400,0x0400,0x0404,0x0000,0x0408,0x0408,0x040c,0x0000,0x0410,0x0410,0x0000,0x0000,0x0000,0x037a,0x072e,0x0b56,0x0000,0x0000,0x0000,0x0000,0x2af7,0x05b3,0x0480,0x0484,0x0000,0x0000,0x048c,0x0000,0x0494,0x26eb,0x0000,0x049c,0x0000,0x0679,0x04b4,0x04b8,0x0c5b,0x0c5f,0x0c63,0x0c87,0x0cab,0x0caf,0x0cb3,0x0cd7,0x0689,0x04b0,0x04b0,0x04b0,0x220b,0x04b0,0x21ab,0x06a9,0x04d8,0x04dc,0x04e0,0x04e4,0x0000,0x0000,0x0000,0x0000,0x0cfb,0x0cff,0x0957,0x0d03,0x095b,0x095f,0x0d47,0x0d4b,0x04e8,0x04ec,0x04f0,0x04f4,0x04f8,0x04fc,0x0000,0x06bb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0504,0x0508,0x050c,0x0510,0x0514,0x0518,0x051c,0x0520,0x0524,0x0528,0x052c,0x0530,0x0534,0x0538,0x053c,0x0540,0x0d4f,0x0d73,0x0d77,0x0d7b,0x0d7f,0x0d83,0x0d87,0x0d8b,0x0d8f,0x0d93,0x0d97,0x0d9b,0x0d9f,0x0da3,0x0da7,0x0dab,0x0963,0x0967,0x096b,0x096f,0x0973,0x0977,0x097b,0x097f,0x0983,0x0987,0x098b,0x098f,0x0daf,0x0db3,0x0993,0x099f,0x09a3,0x09a7,0x09bb,0x09cf,0x09e3,0x09e7,0x09eb,0x09ef,0x0def,0x0e13,0x0000,0x0000,0x0e37,0x0e3b,0x09f3,0x09ff,0x0544,0x0548,0x054c,0x0550,0x0554,0x0558,0x055c,0x0560,0x0564,0x0568,0x056c,0x0570,0x0574,0x0578,0x057c,0x0580,0x0584,0x0588,0x058c,0x0590,0x0594,0x0598,0x059c,0x05a0,0x05a4,0x05a8,0x05ac,0x05b0,0x05b4,0x05b8,0x05bc,0x05c0,0x05c4,0x05c8,0x05cc,0x05d0,0x05d4,0x05d8,0x221f,0x224b,0x05c4,0x05c8,0x05dc,0x05e0,0x05e4,0x05e8,0x0e47,0x05ec,0x05f0,0x05f4,0x06bd,0x05fc,0x06cd,0x06dd,0x0608,0x060c,0x06ef,0x0614,0x06f1,0x0628,0x0703,0x0707,0x063c,0x0640,0x0644,0x0648,0x0e5f,0x070b,0x0a03,0x0a07,0x0e73,0x22cf,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0e77,0x0a1b,0x0a1f,0x0a23,0x0a27,0x0a2b,0x0a2f,0x0a53,0x0a67,0x0a6b,0x0a6f,0x0a73,0x0a77,0x0a7b,0x0a7f,0x0a83,0x0a87,0x0a8b,0x0a8f,0x0a93,0x0a97,0x0a9b,0x0e8b,0x0a9f,0x0ab3,0x0ab7,0x0ac3,0x0abb,0x0abf,0x0acb,0x0ac7,0x0acf,0x0e9f,0x0ad3,0x0ad7,0x0adb,0x0adf,0x0ae3,0x0ae7,0x0aeb,0x0aff,0x0b03,0x0b07,0x0b0b,0x0b0f,0x0b13,0x0b17,0x0658,0x0414,0x0414,0x0418,0x0418,0x041c,0x041c,0x0420,0x0420,0x0424,0x0424,0x0428,0x0428,0x0000,0x0000,0x0000,0x0000,0x0000,0x0492,0x0842,0x0b56,0x0000,0x0000,0x0000,0x0000,0x2af7,0x05ef,0x0480,0x0484,0x0000,0x0488,0x048c,0x0490,0x0494,0x26eb,0x0000,0x049c,0x0000,0x0679,0x04b4,0x04b8,0x0c5b,0x0c5f,0x0c63,0x0c87,0x0cab,0x0caf,0x0cb3,0x0cd7,0x0699,0x04b0,0x04b0,0x04b0,0x220b,0x04b0,0x21ab,0x06a9,0x04d8,0x04dc,0x04e0,0x04e4,0x0000,0x0000,0x0000,0x0000,0x0cfb,0x0cff,0x0957,0x0d03,0x095b,0x095f,0x0d47,0x0d4b,0x04e8,0x04ec,0x04f0,0x04f4,0x04f8,0x04fc,0x0000,0x06bb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0504,0x0508,0x050c,0x0510,0x0514,0x0518,0x051c,0x0520,0x0524,0x0528,0x052c,0x0530,0x0534,0x0538,0x053c,0x0540,0x0d4f,0x0d73,0x0d77,0x0d7b,0x0d7f,0x0d83,0x0d87,0x0d8b,0x0d8f,0x0d93,0x0d97,0x0d9b,0x0d9f,0x0da3,0x0da7,0x0dab,0x0963,0x0967,0x096b,0x096f,0x0973,0x0977,0x097b,0x097f,0x0983,0x0987,0x098b,0x098f,0x0daf,0x0db3,0x0993,0x099f,0x09a3,0x09a7,0x09bb,0x09cf,0x09e3,0x09e7,0x09eb,0x09ef,0x0def,0x0e13,0x0000,0x0000,0x0e37,0x0e3b,0x09f3,0x09ff,0x0544,0x0548,0x054c,0x0550,0x0554,0x0558,0x055c,0x0560,0x0564,0x0568,0x056c,0x0570,0x0574,0x0578,0x057c,0x0580,0x0584,0x0588,0x058c,0x0590,0x0594,0x0598,0x059c,0x05a0,0x05a4,0x05a8,0x05ac,0x05b0,0x05b4,0x05b8,0x05bc,0x05c0,0x05c4,0x05c8,0x05cc,0x05d0,0x05d4,0x05d8,0x221f,0x224b,0x05c4,0x05c8,0x05dc,0x05e0,0x05e4,0x05e8,0x0e5b,0x05ec,0x05f0,0x05f4,0x06bd,0x05fc,0x06cd,0x06dd,0x0608,0x060c,0x06ef,0x0614,0x06f1,0x0628,0x0703,0x0707,0x063c,0x0640,0x0644,0x0648,0x0e5f,0x070b,0x0a03,0x0a07,0x0e73,0x2303,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0654,0x0e77,0x0a1b,0x0a1f,0x0a23,0x0a27,0x0a2b,0x0a2f,0x0a53,0x0a67,0x0a6b,0x0a6f,0x0a73,0x0a77,0x0a7b,0x0a7f,0x0a83,0x0a87,0x0a8b,0x0a8f,0x0a93,0x0a97,0x0a9b,0x0e8b,0x0a9f,0x0ab3,0x0ab7,0x0ac3,0x0abb,0x0abf,0x0acb,0x0ac7,0x0acf,0x0e9f,0x0ad3,0x0ad7,0x0adb,0x0adf,0x0ae3,0x0ae7,0x0aeb,0x0aff,0x0b03,0x0b07,0x0b0b,0x0b0f,0x0b13,0x0b17,0x0658,0x042c,0x05e5,0x0430,0x0629,0x0434,0x0631,0x0438,0x231d,0x043c,0x0440,0x0000,0x26ed,0x0444,0x0444,0x0448,0x0659,0x042c,0x0621,0x0430,0x0629,0x0434,0x0631,0x0438,0x231d,0x043c,0x0440,0x0000,0x26ed,0x0444,0x0444,0x0448,0x0639,0x0591,0x05b5,0x05c5,0x05d5,0x042c,0x0000,0x0430,0x2315,0x0434,0x0000,0x0438,0x231d,0x043c,0x0440,0x0000,0x0000,0x0444,0x0444,0x0448,0x0661,0x042c,0x0000,0x0430,0x2b09,0x0434,0x0000,0x0438,0x2325,0x043c,0x0440,0x14c8,0x2199,0x0444,0x0444,0x0448,0x0669,0x042c,0x0000,0x0430,0x2b11,0x0434,0x0000,0x0438,0x2325,0x043c,0x0440,0x0000,0x2725,0x0444,0x0444,0x0448,0x0671,0x044c,0x1524,0x1530,0x1534,0x1548,0x15f4,0x16d4,0x0000,0x05a1,0x05f1,0x0601,0x0611,0x042c,0x0000,0x0430,0x2315,0x0434,0x0000,0x0438,0x231d,0x043c,0x0440,0x0000,0x0000,0x0444,0x0444,0x0448,0x0641,0x042c,0x286d,0x0430,0x2b09,0x0434,0x0000,0x0438,0x2325,0x043c,0x0440,0x14c8,0x21a1,0x0444,0x0444,0x0448,0x0649,0x042c,0x2865,0x0430,0x2b11,0x0434,0x0000,0x0438,0x2325,0x043c,0x0440,0x0000,0x2725,0x0444,0x0444,0x0448,0x0651,0x044c,0x1524,0x1530,0x1534,0x1548,0x15f4,0x16d4,0x17a4,0x0450,0x0454,0x0458,0x045c,0x0000,0x0000,0x0000,0x0460,0x0464,0x0468,0x0000,0x0000,0x152c,0x046c,0x0470,0x0474,0x0478,0x047c,0x158c,0x1594,0x1560,0x1564,0x1598,0x159c,0x0478,0x047c,0x0000,0x0000,0x1560,0x1564,0x0000,0x0000,0x0478,0x047c,0x1590,0x0000,0x1560,0x15a0,0x15a8,0x15b0,0x0478,0x047c,0x0000,0x0000,0x1560,0x15a4,0x15ac,0x15b4,0x0000,0x047c,0x158c,0x1594,0x1560,0x1564,0x1598,0x159c,0x0000,0x047c,0x0000,0x0000,0x1560,0x1564,0x0000,0x0000,0x0000,0x047c,0x1590,0x0000,0x1560,0x0000,0x0000,0x0000,0x0000,0x047c,0x0000,0x0000,0x1560,0x0000,0x0000,0x0000,0x04a0,0x04b0,0x04a4,0x04b0,0x04a8,0x04b0,0x04ac,0x04b0,0x04ac,0x04b0,0x04ac,0x04b0,0x04ac,0x04b0,0x04ac,0x04b0,0x04bc,0x04b0,0x04c0,0x04b0,0x04c4,0x04b0,0x04c8,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04bc,0x04b0,0x04c0,0x04b0,0x04c4,0x04b0,0x04c8,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04cc,0x04b0,0x04d0,0x04b0,0x04d4,0x04d4,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x0500,0x0000,0x0000,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x05f8,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0600,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0604,0x0000,0x0000,0x0000,0x0610,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0618,0x0618,0x061c,0x061c,0x0620,0x0620,0x0624,0x0624,0x062c,0x062c,0x0630,0x062c,0x0634,0x0634,0x0638,0x0634,0x070d,0x0000,0x0000,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x064c,0x0000,0x0000,0x0000,0x0650,0x0000,0x0000,0x0000,0x162c,0x0000,0x1630,0x0000,0x1634,0x0000,0x1538,0x1638,0x153c,0x163c,0x0b1b,0x0b1f,0x0b23,0x0b27,0x0b2b,0x0b2f,0x0b33,0x0b37,0x0b3b,0x0b3f,0x0b43,0x0b47,0x0000,0x0000,0x0000,0x0000,0x0ec3,0x0000,0x0000,0x0000,0x0ec7,0x0ecb,0x0000,0x0ecf,0x0000,0x0000,0x0000,0x0000,0x0b4b,0x0b4f,0x0b53,0x0000,0x0ed3,0x0ed7,0x0edb,0x0edf,0x0ee3,0x0ee7,0x0000,0x0000,0x0eeb,0x0eef,0x0ef3,0x0f07,0x0000,0x0000,0x0000,0x0000,0x0f0b,0x0f0f,0x0f13,0x0f17,0x0f1b,0x0f1f,0x0000,0x0f23,0x0f27,0x0f2b,0x0f2f,0x0f33,0x0f37,0x0f3b,0x0f3f,0x0f43,0x0f47,0x0f4b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x22a7,0x22bb,0x26f7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x270b,0x270f,0x2713,0x2717,0x271b,0x271f,0x0000,0x234f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a7b,0x0000,0x0000,0x1003,0x1007,0x100b,0x100f,0x1013,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x082f,0x0943,0x0000,0x0000,0x0000,0x21c7,0x20cf,0x0000,0x0f4f,0x0f67,0x2acf,0x2ae3,0x2877,0x0000,0x0000,0x0000,0x0831,0x0831,0x0000,0x0660,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x065c,0x0000,0x0b1b,0x0b1f,0x0b23,0x0b27,0x0b2b,0x0b2f,0x0b33,0x0b37,0x0b3b,0x0b3f,0x0b43,0x0b47,0x0000,0x0000,0x0000,0x0000,0x0ec3,0x0000,0x0000,0x0000,0x0ec7,0x0ecb,0x0000,0x0ecf,0x0000,0x0000,0x0000,0x0000,0x0b4b,0x0b4f,0x0b53,0x0000,0x0ed3,0x0ed7,0x0edb,0x0edf,0x0ee3,0x0ee7,0x0000,0x0000,0x0eeb,0x0eef,0x0ef3,0x0f07,0x0000,0x0000,0x0000,0x0000,0x0f0b,0x0f0f,0x0f13,0x0f17,0x0f1b,0x0f1f,0x0000,0x0f23,0x0f27,0x0f2b,0x0f2f,0x0f33,0x0f37,0x0f3b,0x0f3f,0x0f43,0x0f47,0x0f4b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x22a7,0x22bb,0x26f7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x270b,0x270f,0x2713,0x2717,0x271b,0x271f,0x0000,0x234f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a7b,0x0000,0x0000,0x1003,0x1007,0x100b,0x100f,0x1013,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x082f,0x0943,0x0000,0x0000,0x0000,0x21c7,0x20cf,0x0000,0x0f63,0x0f67,0x2acf,0x2ae3,0x2877,0x0000,0x0000,0x0000,0x0945,0x0945,0x0000,0x0668,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x0664,0x0000,0x066c,0x0670,0x0870,0x0874,0x0674,0x0678,0x0888,0x088c,0x067c,0x0680,0x0890,0x0894,0x0684,0x096c,0x0000,0x0000,0x0688,0x0970,0x0000,0x0000,0x068c,0x0974,0x0000,0x0000,0x0690,0x0978,0x0000,0x0000,0x0694,0x097c,0x0000,0x0000,0x0698,0x0980,0x0000,0x0000,0x069c,0x0984,0x0000,0x0000,0x06a0,0x0988,0x0000,0x0000,0x06a4,0x098c,0x0000,0x0000,0x06a8,0x0990,0x0000,0x0000,0x06ac,0x0994,0x0000,0x0000,0x06b0,0x0998,0x0000,0x0000,0x0996,0x0db6,0x0000,0x0000,0x06b4,0x06b8,0x06b4,0x06b8,0x0000,0x0000,0x0000,0x0000,0x06bc,0x09ac,0x09b0,0x0000,0x06c0,0x09b4,0x09b8,0x09bc,0x09a9,0x0dbd,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x06c4,0x0000,0x0000,0x0000,0x06c8,0x0000,0x0000,0x0000,0x06cc,0x0000,0x0000,0x09bd,0x0dcd,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x06d0,0x0000,0x0000,0x0000,0x06d4,0x0000,0x0000,0x0000,0x06d8,0x0000,0x0000,0x09d1,0x0ddd,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x06dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x06e0,0x0000,0x0000,0x06e4,0x09e8,0x0000,0x0000,0x06e8,0x09ec,0x0000,0x0000,0x06ec,0x09f0,0x0000,0x0000,0x06f0,0x0000,0x0000,0x0000,0x09f6,0x0e3e,0x0a1c,0x0000,0x06f4,0x06f8,0x06f4,0x06f8,0x0000,0x0000,0x0000,0x0000,0x06fc,0x0a20,0x0a24,0x0000,0x0700,0x0a54,0x0000,0x0000,0x0a09,0x0e61,0x0000,0x0000,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0000,0x0704,0x0708,0x0a6c,0x0000,0x0000,0x070c,0x0a70,0x0000,0x0000,0x0710,0x0a74,0x0000,0x0000,0x0714,0x0a78,0x0000,0x0000,0x0718,0x0a7c,0x0000,0x0000,0x0000,0x0a80,0x0a41,0x0a31,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x071c,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0000,0x0720,0x0a55,0x0e79,0x0000,0x0000,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0000,0x0724,0x0728,0x0a88,0x0000,0x0000,0x072c,0x0a8c,0x0000,0x0000,0x0730,0x0a90,0x0000,0x0000,0x0734,0x0a94,0x0000,0x0000,0x0738,0x0a98,0x0000,0x0000,0x073c,0x0a9c,0x0000,0x0000,0x0740,0x0aa0,0x0000,0x0000,0x0744,0x0aa4,0x0000,0x0000,0x0748,0x0aa8,0x0000,0x0000,0x074c,0x0aac,0x0000,0x0000,0x0750,0x0ab0,0x0000,0x0000,0x0754,0x0ab4,0x0000,0x0000,0x0758,0x0ab8,0x0000,0x0000,0x075c,0x0abc,0x0000,0x0000,0x0aa1,0x0e8d,0x0000,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0760,0x0000,0x0764,0x0ad0,0x0000,0x0000,0x0768,0x0ad4,0x0000,0x0000,0x076c,0x0ad8,0x0000,0x0000,0x0770,0x0adc,0x0000,0x0000,0x0774,0x0ae0,0x0000,0x0000,0x0778,0x0ae4,0x0000,0x0000,0x077c,0x0ae8,0x0000,0x0000,0x0780,0x0aec,0x0000,0x0000,0x0784,0x0af4,0x0000,0x0000,0x0788,0x0af8,0x0000,0x0000,0x078c,0x0afc,0x0000,0x0000,0x0790,0x0b00,0x0000,0x0000,0x0794,0x0b04,0x0000,0x0000,0x0798,0x0b08,0x0000,0x0000,0x0aed,0x0eb1,0x0000,0x0000,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x0000,0x079c,0x07a0,0x0b10,0x0000,0x0000,0x07a4,0x0b14,0x0000,0x0000,0x07a8,0x0b18,0x0000,0x0000,0x07ac,0x0b1c,0x0000,0x0000,0x07b0,0x0b20,0x0000,0x0000,0x07b4,0x0b24,0x0000,0x0000,0x07b8,0x0b28,0x0000,0x0000,0x07bc,0x0b2c,0x0000,0x0000,0x07c0,0x0b30,0x0000,0x0000,0x07c4,0x0b34,0x0000,0x0000,0x07c8,0x0b38,0x0000,0x0000,0x07cc,0x0b3c,0x0000,0x0000,0x07d0,0x0b40,0x0000,0x0000,0x07d4,0x0b44,0x0000,0x0000,0x07d8,0x0b48,0x0000,0x0000,0x07dc,0x0b4c,0x0000,0x0000,0x07e0,0x0b50,0x0000,0x0000,0x07e4,0x0b54,0x0000,0x0000,0x07e8,0x0b58,0x0000,0x0000,0x07ec,0x0b6c,0x0000,0x0000,0x07f0,0x0b70,0x0000,0x0000,0x07f4,0x0b74,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f7b,0x0f7f,0x0f83,0x0f87,0x0f8b,0x0f8f,0x0f93,0x0c57,0x0000,0x0000,0x0000,0x0000,0x0f97,0x0fab,0x0fbf,0x0fcb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fcf,0x0fd3,0x0fd7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0fe3,0x0fe7,0x0feb,0x0000,0x0fef,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff3,0x0ff7,0x0ffb,0x0fff,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2723,0x0000,0x2353,0x2357,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1017,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x284b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f8,0x0c08,0x0000,0x0000,0x07fc,0x0800,0x0804,0x0808,0x080c,0x0810,0x0814,0x0818,0x0c65,0x0c75,0x0828,0x082c,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x081c,0x0820,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0824,0x0000,0x0c89,0x0c99,0x0000,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0830,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0834,0x0000,0x0838,0x083c,0x0000,0x0000,0x0840,0x0844,0x0000,0x0000,0x0cb5,0x0cc5,0x0854,0x0000,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0848,0x084c,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0850,0x0000,0x0cd9,0x0ce9,0x0000,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x0858,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x085c,0x0000,0x0860,0x0864,0x0000,0x0000,0x0868,0x086c,0x0000,0x0000,0x0d05,0x0d15,0x0d25,0x0d35,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x0878,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x087c,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0880,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0884,0x0000,0x0898,0x089c,0x0000,0x0000,0x08a0,0x08a4,0x0000,0x0000,0x0d51,0x0d61,0x0000,0x0000,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08a8,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x0000,0x08ac,0x08b0,0x08b4,0x08b8,0x08bc,0x08c0,0x0000,0x08c4,0x0000,0x08c8,0x0000,0x08cc,0x0000,0x08d0,0x08d4,0x0000,0x0000,0x08d8,0x08dc,0x0000,0x0000,0x08e0,0x08e4,0x0000,0x0000,0x08e8,0x08ec,0x0000,0x0000,0x08f0,0x08f4,0x08f8,0x08fc,0x0900,0x0904,0x0908,0x090c,0x0910,0x0914,0x0918,0x091c,0x0920,0x0924,0x0928,0x0000,0x092c,0x0930,0x0934,0x0938,0x093c,0x0940,0x0944,0x0948,0x094c,0x0950,0x0954,0x0958,0x095c,0x0960,0x0964,0x0968,0x0000,0x099c,0x0000,0x0000,0x0000,0x09a0,0x0000,0x0000,0x09a4,0x09a8,0x09a4,0x09a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x09c0,0x0000,0x0000,0x0000,0x09c4,0x0000,0x0000,0x0000,0x09c8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x09cc,0x0000,0x0000,0x0000,0x09d0,0x0000,0x0000,0x0000,0x09d4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x09d8,0x0000,0x09dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x09e0,0x0000,0x09e4,0x1540,0x0df1,0x0000,0x0e01,0x0000,0x09f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x0000,0x09f8,0x1544,0x0e15,0x0000,0x0e25,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x09fc,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a00,0x0000,0x0a04,0x0000,0x0a08,0x0000,0x0a0c,0x0000,0x0a10,0x0a14,0x0a18,0x0a14,0x0a18,0x0000,0x0000,0x0000,0x0000,0x0e49,0x232d,0x21e9,0x233d,0x0a28,0x0000,0x0a2c,0x0000,0x0a30,0x0000,0x0a34,0x0000,0x1614,0x0000,0x1618,0x0a38,0x161c,0x0a3c,0x1624,0x0a40,0x0e49,0x232d,0x21f9,0x233d,0x0a44,0x0a48,0x0a4c,0x0a50,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0000,0x0a58,0x0a5c,0x0a60,0x0000,0x0000,0x0000,0x0a64,0x0000,0x0a68,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0a84,0x0000,0x0ac0,0x0ac4,0x0ac8,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0acc,0x0000,0x0000,0x0000,0x0000,0x0ea1,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0af0,0x0000,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b0c,0x0000,0x0b5c,0x0000,0x0000,0x0000,0x0b60,0x0000,0x0000,0x0000,0x0b64,0x0000,0x0000,0x0000,0x0b68,0x0000,0x0000,0x0000,0x0b78,0x0000,0x0000,0x0000,0x0b7c,0x0000,0x0000,0x0000,0x0b80,0x0000,0x0000,0x0000,0x0b84,0x0000,0x0000,0x0000,0x0b88,0x0000,0x0000,0x0000,0x0b8c,0x0000,0x0000,0x0000,0x0b90,0x0000,0x0000,0x0000,0x0b94,0x0000,0x0000,0x0000,0x0ef5,0x0000,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0b98,0x0000,0x0000,0x0b9c,0x0000,0x0000,0x0000,0x0ba0,0x0000,0x0000,0x0000,0x0ba4,0x0000,0x0000,0x0000,0x0ba8,0x0000,0x0000,0x0000,0x0bac,0x0000,0x0000,0x0000,0x0bb0,0x0000,0x0000,0x0000,0x0bb4,0x0000,0x0000,0x0000,0x0bb8,0x0000,0x0000,0x0000,0x0bbc,0x0000,0x0000,0x0000,0x0bc0,0x0000,0x0000,0x0000,0x0bc4,0x0000,0x0000,0x0000,0x0bc8,0x0000,0x0000,0x0000,0x0bcc,0x0000,0x0000,0x0000,0x0bd0,0x0000,0x0000,0x0000,0x0bd4,0x0000,0x0000,0x0000,0x0bd8,0x0000,0x0000,0x0000,0x0bdc,0x0000,0x0000,0x0000,0x0be0,0x0000,0x0000,0x0000,0x0f51,0x26c9,0x26a9,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0be4,0x0000,0x0000,0x0f51,0x26d9,0x26b9,0x0f69,0x0000,0x0000,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0be8,0x0000,0x0000,0x0bec,0x0000,0x0000,0x0000,0x0bf0,0x0000,0x0000,0x0000,0x0bf4,0x0000,0x0000,0x0000,0x0bf8,0x0000,0x0000,0x0000,0x0bfc,0x0000,0x0000,0x0000,0x0c00,0x0000,0x0000,0x0000,0x0c04,0x0000,0x0000,0x0000,0x0f99,0x0000,0x0000,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0c0c,0x0c10,0x0000,0x0fad,0x0000,0x0000,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0c14,0x0c18,0x0000,0x0fc2,0x0000,0x0000,0x0c1c,0x0c20,0x0c1c,0x0c20,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c24,0x0000,0x0000,0x0000,0x0c28,0x0000,0x0000,0x0000,0x0c2c,0x0000,0x0000,0x0000,0x0fda,0x0000,0x0000,0x0c30,0x0c34,0x0c30,0x0c34,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c38,0x0000,0x0000,0x0000,0x0c3c,0x0000,0x0000,0x0000,0x0c40,0x0000,0x0000,0x0000,0x0c44,0x0000,0x0000,0x0000,0x0c48,0x0000,0x0000,0x0000,0x0c4c,0x0000,0x0000,0x0000,0x0c50,0x0000,0x0000,0x0000,0x0c54,0x0000,0x0000,0x0000,0x0c58,0x0000,0x0000,0x0000,0x0c5c,0x2a8d,0x0000,0x0000,0x0c60,0x2a9d,0x0000,0x0000,0x0c64,0x2aad,0x0000,0x0000,0x0c68,0x2abd,0x0000,0x0000,0x0c6c,0x0000,0x0000,0x1a5b,0x1a5f,0x1a63,0x1a67,0x1a6b,0x1a6f,0x1a73,0x1a77,0x1a7b,0x1a7f,0x1a83,0x1a87,0x1a8b,0x1a97,0x1aa3,0x1aaf,0x0000,0x0000,0x0000,0x1abb,0x0000,0x0000,0x1ac7,0x1ad3,0x1ad7,0x1ae3,0x1aef,0x0000,0x1afb,0x1aff,0x1b03,0x0000,0x1b07,0x1b0b,0x1b0f,0x1b13,0x1b17,0x1b1b,0x0000,0x0000,0x1b1f,0x1b23,0x1b27,0x1b3b,0x1b3f,0x1b5b,0x1b77,0x1b93,0x1baf,0x1bb3,0x1bb7,0x1bbb,0x1bbf,0x1bc3,0x1bc7,0x1bd3,0x1bd7,0x1bdb,0x1bdf,0x1be3,0x1be7,0x1beb,0x1bef,0x1bf3,0x1bf7,0x1bfb,0x0000,0x0000,0x0000,0x1c07,0x1c13,0x1c1f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x272f,0x2753,0x2777,0x2783,0x0000,0x0000,0x0000,0x0000,0x1c2b,0x1c37,0x1c43,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2827,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c5f,0x1c6b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c77,0x0000,0x1c93,0x0000,0x1caf,0x1ccb,0x1ce7,0x1d03,0x0000,0x0000,0x1d1f,0x1d2b,0x1d37,0x1d43,0x1d4f,0x1d5b,0x1d67,0x1d73,0x1d7f,0x1d8b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d97,0x1da3,0x1daf,0x1dbb,0x1dc7,0x1dd3,0x1ddf,0x1deb,0x1df7,0x1e03,0x278f,0x27f3,0x0000,0x0000,0x2833,0x283f,0x1e0f,0x1e1b,0x1e27,0x1e33,0x1e3f,0x1e4b,0x1e57,0x1e63,0x1e6f,0x1e7b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x235b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e17,0x111b,0x122f,0x1233,0x1237,0x123b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x203f,0x204b,0x0000,0x208f,0x20ab,0x2077,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x111e,0x0000,0x0000,0x0c70,0x0c70,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x154e,0x112e,0x134a,0x0000,0x0000,0x0000,0x2cae,0x1a5b,0x1a5f,0x1a63,0x1a67,0x1a6b,0x1a6f,0x1a73,0x1a77,0x1a7b,0x1a7f,0x1a83,0x1a87,0x1a8b,0x1a97,0x1aa3,0x1aaf,0x0000,0x0000,0x0000,0x1abb,0x0000,0x0000,0x1ac7,0x1ad3,0x1ad7,0x1ae3,0x1aef,0x0000,0x1afb,0x1aff,0x1b03,0x0000,0x1b07,0x1b0b,0x1b0f,0x1b13,0x1b17,0x1b1b,0x0000,0x0000,0x1b1f,0x1b23,0x1b27,0x1b3b,0x1b3f,0x1b5b,0x1b77,0x1b93,0x1baf,0x1bb3,0x1bb7,0x1bbb,0x1bbf,0x1bc3,0x1bc7,0x1bd3,0x1bd7,0x1bdb,0x1bdf,0x1be3,0x1be7,0x1beb,0x1bef,0x1bf3,0x1bf7,0x1bfb,0x0000,0x0000,0x0000,0x1c07,0x1c13,0x1c1f,0x0000,0x2b1b,0x0000,0x2b7f,0x0000,0x0000,0x0000,0x0000,0x272f,0x2753,0x2777,0x2783,0x0000,0x0000,0x0000,0x0000,0x1c2b,0x1c37,0x1c43,0x0000,0x2be3,0x0000,0x2c17,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c7b,0x0000,0x0000,0x0000,0x0000,0x0000,0x2827,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c5f,0x1c6b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c77,0x0000,0x1c93,0x0000,0x1caf,0x1ccb,0x1ce7,0x1d03,0x0000,0x0000,0x1d1f,0x1d2b,0x1d37,0x1d43,0x1d4f,0x1d5b,0x1d67,0x1d73,0x1d7f,0x1d8b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d97,0x1da3,0x1daf,0x1dbb,0x1dc7,0x1dd3,0x1ddf,0x1deb,0x1df7,0x1e03,0x278f,0x27f3,0x0000,0x0000,0x2833,0x283f,0x1e0f,0x1e1b,0x1e27,0x1e33,0x1e3f,0x1e4b,0x1e57,0x1e63,0x1e6f,0x1e7b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x235b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e17,0x111b,0x122f,0x1233,0x1237,0x123b,0x28bb,0x28d7,0x28f3,0x290f,0x292b,0x2947,0x2963,0x297f,0x299b,0x29b7,0x29d3,0x29ef,0x2a0b,0x2a27,0x2a43,0x2a5f,0x0000,0x0000,0x203f,0x204b,0x0000,0x208f,0x20ab,0x2077,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0c74,0x0000,0x0000,0x0000,0x0c78,0x0000,0x0000,0x0000,0x0c7c,0x0000,0x0000,0x0000,0x0c80,0x0000,0x0000,0x1e87,0x1e93,0x1e9f,0x0000,0x1eab,0x1eb7,0x1ec3,0x0000,0x1ecf,0x1ed3,0x1ed7,0x1edb,0x1edf,0x1ee3,0x1ee7,0x1eeb,0x0000,0x0000,0x0000,0x0000,0x1eef,0x1f13,0x1f37,0x1f4f,0x1f5b,0x1f67,0x0000,0x0000,0x0000,0x1f73,0x0000,0x0000,0x1f7f,0x1f8b,0x1f97,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44fb,0x4517,0x4533,0x454f,0x0000,0x0000,0x0000,0x0000,0x1faf,0x1fbb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc7,0x1fcb,0x1fd7,0x0000,0x1fdb,0x0000,0x1fdf,0x0000,0x0000,0x0000,0x1feb,0x1ff7,0x2003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x200f,0x201b,0x2027,0x2033,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2367,0x2373,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x133f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2083,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1342,0x0000,0x0000,0x0c84,0x0c84,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e87,0x1e93,0x1e9f,0x0000,0x1eab,0x1eb7,0x1ec3,0x0000,0x1ecf,0x1ed3,0x1ed7,0x1edb,0x1edf,0x1ee3,0x1ee7,0x1eeb,0x0000,0x0000,0x0000,0x0000,0x1eef,0x1f13,0x1f43,0x1f4f,0x1f5b,0x1f67,0x0000,0x0000,0x0000,0x1f73,0x0000,0x0000,0x1f7f,0x1f8b,0x1fa3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44fb,0x4517,0x4533,0x454f,0x0000,0x0000,0x0000,0x0000,0x1faf,0x1fbb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fc7,0x1fcb,0x1fd7,0x0000,0x1fdb,0x0000,0x1fdf,0x0000,0x0000,0x0000,0x1feb,0x1ff7,0x2003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x200f,0x201b,0x2027,0x2033,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2367,0x2373,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x133f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2083,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x154b,0x166f,0x1693,0x16d7,0x170b,0x170f,0x1713,0x174f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1783,0x1787,0x178b,0x178f,0x17b3,0x17b7,0x17bb,0x17bf,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x41db,0x420f,0x0000,0x4243,0x4277,0x42ab,0x42df,0x0000,0x0000,0x4313,0x4347,0x0000,0x0000,0x0000,0x0000,0x17c3,0x17e7,0x17eb,0x17ef,0x17f3,0x17f7,0x17fb,0x17ff,0x1803,0x1807,0x180b,0x180f,0x1813,0x1817,0x181b,0x181f,0x1823,0x1827,0x182b,0x182f,0x1833,0x1837,0x183b,0x183f,0x1843,0x1847,0x184b,0x184f,0x1853,0x1857,0x185b,0x1873,0x1877,0x187b,0x188f,0x18a3,0x18b7,0x18bb,0x18bf,0x18c3,0x0000,0x0000,0x0000,0x0000,0x18cf,0x18d3,0x18d7,0x18f7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43af,0x43c3,0x43f7,0x445f,0x0000,0x0000,0x0000,0x0000,0x437b,0x44c7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18fb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x191f,0x0000,0x1923,0x192f,0x194b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x194f,0x1953,0x1957,0x195b,0x195f,0x1963,0x1967,0x1973,0x1987,0x198b,0x198f,0x1993,0x1997,0x199b,0x199f,0x19a3,0x19a7,0x19ab,0x19af,0x19b3,0x19b7,0x19bb,0x19bf,0x19c3,0x19d7,0x19db,0x19e7,0x19df,0x19e3,0x19eb,0x19ef,0x19f3,0x19f7,0x1a0b,0x1a0f,0x1a13,0x1a17,0x1a1b,0x1a1f,0x1a23,0x1a3f,0x1a43,0x1a47,0x1a4b,0x1a4f,0x1a53,0x1a57,0x0000,0x0c88,0x0c8c,0x164d,0x165d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x154b,0x166f,0x1693,0x16d7,0x170b,0x170f,0x1713,0x174f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1783,0x1787,0x178b,0x178f,0x17b3,0x17b7,0x17bb,0x17bf,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x41db,0x420f,0x0000,0x4243,0x4277,0x42ab,0x42df,0x0000,0x0000,0x4313,0x4347,0x0000,0x0000,0x0000,0x0000,0x17c3,0x17e7,0x17eb,0x17ef,0x17f3,0x17f7,0x17fb,0x17ff,0x1803,0x1807,0x180b,0x180f,0x1813,0x1817,0x181b,0x181f,0x1823,0x1827,0x182b,0x182f,0x1833,0x1837,0x183b,0x183f,0x1843,0x1847,0x184b,0x184f,0x1853,0x1857,0x1867,0x1873,0x1877,0x187b,0x188f,0x18a3,0x18b7,0x18bb,0x18bf,0x18c3,0x0000,0x0000,0x0000,0x0000,0x18cf,0x18d3,0x18e3,0x18f7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43af,0x43c3,0x4413,0x447b,0x0000,0x0000,0x0000,0x0000,0x437b,0x44c7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18fb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x191f,0x0000,0x1923,0x192f,0x194b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x194f,0x1953,0x1957,0x195b,0x195f,0x1963,0x1967,0x1973,0x1987,0x198b,0x198f,0x1993,0x1997,0x199b,0x199f,0x19a3,0x19a7,0x19ab,0x19af,0x19b3,0x19b7,0x19bb,0x19bf,0x19c3,0x19d7,0x19db,0x19e7,0x19df,0x19e3,0x19eb,0x19ef,0x19f3,0x19f7,0x1a0b,0x1a0f,0x1a13,0x1a17,0x1a1b,0x1a1f,0x1a23,0x1a3f,0x1a43,0x1a47,0x1a4b,0x1a4f,0x1a53,0x1a57,0x0000,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c90,0x0c94,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0c98,0x0c9c,0x0ca0,0x0ca4,0x1671,0x1681,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0ca8,0x0cac,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x0cb0,0x0cb4,0x1695,0x16b5,0x0ccc,0x16ce,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x16a6,0x16ae,0x0cb8,0x0cb8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cbc,0x0cbc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x16c6,0x0000,0x0cc0,0x0cc0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cc4,0x0cc4,0x0cc8,0x0cc8,0x0000,0x0000,0x0000,0x0000,0x16d9,0x16f1,0x0000,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x16ea,0x0000,0x0cd0,0x0cd0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x1702,0x0000,0x0cd4,0x0cd4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cd8,0x0cdc,0x0000,0x0000,0x0ce0,0x0ce4,0x0000,0x0000,0x1715,0x1735,0x0cf4,0x0000,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x1726,0x172e,0x0ce8,0x0ce8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0cec,0x0cec,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x1746,0x0000,0x0cf0,0x0cf0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1751,0x1769,0x0000,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x1762,0x0000,0x0cf8,0x0cf8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x177a,0x0000,0x0cfc,0x0cfc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0d00,0x0d04,0x0000,0x0000,0x0d08,0x0d0c,0x0000,0x0000,0x0000,0x0000,0x0d10,0x0d14,0x1791,0x17a1,0x0000,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d18,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0d1c,0x0000,0x0000,0x0000,0x0d20,0x0d24,0x0000,0x0000,0x0d28,0x0d2c,0x0d30,0x0d34,0x0000,0x0000,0x0d38,0x0d3c,0x0000,0x0000,0x17c5,0x17d5,0x0000,0x0000,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d40,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0000,0x0d44,0x0d48,0x0d4c,0x0d50,0x0d54,0x0d58,0x0000,0x0d5c,0x0000,0x0d60,0x0000,0x0d64,0x0000,0x0d68,0x0d6c,0x0000,0x0000,0x0d70,0x0d74,0x0000,0x0000,0x0d78,0x0d7c,0x0000,0x0000,0x0d80,0x0d84,0x0000,0x0000,0x0d88,0x0d8c,0x0d90,0x0d94,0x0d98,0x0d9c,0x0da0,0x0da4,0x0da8,0x0dac,0x0db0,0x0db4,0x0db8,0x0dbc,0x0dc0,0x0000,0x0dc4,0x0dc8,0x0dcc,0x0dd0,0x0dd4,0x0dd8,0x0ddc,0x0de0,0x0de4,0x0de8,0x0dec,0x0df0,0x0df4,0x0df8,0x0dfc,0x0e00,0x0000,0x0e04,0x0000,0x0000,0x0000,0x0e08,0x0000,0x0000,0x0000,0x0e0c,0x0000,0x0000,0x0000,0x0e10,0x0000,0x0000,0x0000,0x0e14,0x0000,0x0000,0x0000,0x0e18,0x0000,0x0000,0x0000,0x0e1c,0x0000,0x0000,0x0000,0x0e20,0x0000,0x0000,0x0000,0x0e24,0x0000,0x0000,0x0000,0x0e28,0x0000,0x0000,0x0000,0x0e2c,0x0000,0x0000,0x0000,0x0e30,0x0000,0x0000,0x0000,0x0e34,0x0000,0x0000,0x0000,0x0e38,0x0000,0x0000,0x0000,0x185e,0x0000,0x0000,0x0e3c,0x0e3c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x186a,0x0000,0x0000,0x0e3c,0x0e40,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e44,0x0e48,0x0000,0x0000,0x0e4c,0x0e50,0x0e54,0x0000,0x187d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e58,0x0000,0x0000,0x0000,0x0e5c,0x0000,0x0000,0x0000,0x0e60,0x0000,0x0000,0x0000,0x1891,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e64,0x0000,0x0000,0x0000,0x0e68,0x0000,0x0000,0x0000,0x0e6c,0x0000,0x0000,0x0000,0x18a5,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e70,0x0000,0x0e74,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e78,0x0000,0x0e7c,0x0000,0x0e80,0x0000,0x0000,0x0000,0x0e84,0x0000,0x0000,0x0000,0x0e88,0x0000,0x0000,0x18c6,0x0000,0x0000,0x0000,0x0e8c,0x0e8c,0x0e90,0x0e90,0x0000,0x0000,0x0000,0x0000,0x0000,0x0e94,0x0000,0x0e98,0x0000,0x0e9c,0x0000,0x0ea0,0x0000,0x18da,0x18ee,0x0000,0x0ea4,0x0ea4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18e6,0x18ee,0x0000,0x0ea4,0x0ea8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0eac,0x0eac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0eb0,0x0eb4,0x0000,0x18fd,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x190e,0x0000,0x1916,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0eb8,0x0eb8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ebc,0x0ebc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ec0,0x0ec4,0x0ec8,0x0ecc,0x0000,0x1926,0x0000,0x0000,0x0ed0,0x0ed0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1931,0x0000,0x0000,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0000,0x1942,0x0ed4,0x0ed4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ed8,0x0edc,0x0000,0x0000,0x0000,0x0ee0,0x0000,0x0ee4,0x0000,0x0ee8,0x0000,0x0000,0x0000,0x0eec,0x0000,0x0000,0x0000,0x0ef0,0x0000,0x0000,0x0000,0x0ef4,0x0000,0x0000,0x0000,0x0ef8,0x0000,0x0000,0x0000,0x196a,0x0000,0x0000,0x0efc,0x0efc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1975,0x0000,0x0000,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f00,0x0000,0x0f04,0x0000,0x0000,0x0000,0x0f08,0x0000,0x0000,0x0000,0x0f0c,0x0000,0x0000,0x0000,0x0f10,0x0000,0x0000,0x0000,0x0f14,0x0000,0x0000,0x0000,0x0f18,0x0000,0x0000,0x0000,0x0f1c,0x0000,0x0000,0x0000,0x0f20,0x0000,0x0000,0x0000,0x0f24,0x0000,0x0000,0x0000,0x0f28,0x0000,0x0000,0x0000,0x0f2c,0x0000,0x0000,0x0000,0x0f30,0x0000,0x0000,0x0000,0x0f34,0x0000,0x0000,0x0000,0x0f38,0x0000,0x0000,0x0000,0x0f3c,0x0f40,0x0f44,0x0000,0x19c5,0x0000,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0f48,0x0000,0x0000,0x0f4c,0x0000,0x0000,0x0000,0x0f50,0x0000,0x0000,0x0000,0x0f54,0x0000,0x0000,0x0000,0x0f58,0x0000,0x0000,0x0000,0x0f5c,0x0000,0x0000,0x0000,0x0f60,0x0000,0x0000,0x0000,0x0f64,0x0000,0x0000,0x0000,0x0f68,0x0000,0x0000,0x0000,0x0000,0x0000,0x19f9,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0f6c,0x0000,0x0000,0x0f70,0x0000,0x0000,0x0000,0x0f74,0x0000,0x0000,0x0000,0x0f78,0x0000,0x0000,0x0000,0x0f7c,0x0000,0x0000,0x0000,0x0f80,0x0000,0x0000,0x0000,0x0f84,0x0000,0x0000,0x0000,0x1a25,0x0000,0x0000,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0000,0x1a36,0x0f88,0x0f88,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0f8c,0x0000,0x0000,0x0000,0x0f90,0x0000,0x0000,0x0000,0x0f94,0x0000,0x0000,0x0000,0x0f98,0x0000,0x0000,0x0000,0x0f9c,0x0000,0x0000,0x0000,0x0fa0,0x0000,0x0000,0x0000,0x0fa4,0x0000,0x0000,0x0000,0x0fa8,0x0000,0x0000,0x0000,0x0fac,0x0000,0x0000,0x0000,0x0fb0,0x0000,0x0000,0x0000,0x0fb4,0x0000,0x0000,0x0000,0x0fb8,0x0000,0x0000,0x0000,0x0fbc,0x0000,0x0000,0x0000,0x0fc0,0x0000,0x0000,0x0000,0x0fc4,0x0000,0x0000,0x0000,0x0fc8,0x0000,0x0000,0x0000,0x0fcc,0x0000,0x0000,0x0000,0x0fd0,0x0000,0x0000,0x0000,0x0fd4,0x0000,0x0000,0x0000,0x1a8e,0x0000,0x0000,0x0fd8,0x0000,0x0fd8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1a9a,0x0000,0x0000,0x0fdc,0x0000,0x0fdc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1aa6,0x0000,0x0000,0x0fe0,0x0000,0x0fe0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ab2,0x0000,0x0000,0x0fe4,0x0000,0x0fe4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1abe,0x0000,0x0000,0x0fe8,0x0000,0x0fe8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1aca,0x0000,0x0000,0x0000,0x0000,0x0fec,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0ff0,0x0000,0x0000,0x0000,0x1ada,0x0000,0x0000,0x0ff4,0x0000,0x0ff4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ae6,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1af2,0x0000,0x0000,0x0000,0x0000,0x0ffc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x1004,0x0000,0x0000,0x0000,0x1008,0x0000,0x0000,0x0000,0x100c,0x0000,0x0000,0x0000,0x1010,0x0000,0x0000,0x0000,0x1014,0x0000,0x0000,0x0000,0x1018,0x0000,0x0000,0x0000,0x101c,0x0000,0x0000,0x0000,0x1020,0x0000,0x0000,0x0000,0x1024,0x0000,0x0000,0x0000,0x1028,0x0000,0x0000,0x0000,0x1b29,0x0000,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x102c,0x0000,0x0000,0x1030,0x0000,0x0000,0x0000,0x1b41,0x0000,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1b52,0x0000,0x1034,0x0000,0x1034,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1b5d,0x0000,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1b6e,0x0000,0x1038,0x0000,0x1038,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1b79,0x0000,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x1b8a,0x0000,0x103c,0x0000,0x103c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1b95,0x0000,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1ba6,0x0000,0x1040,0x0000,0x1040,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1044,0x0000,0x0000,0x0000,0x1048,0x0000,0x0000,0x0000,0x104c,0x0000,0x0000,0x0000,0x1050,0x0000,0x0000,0x0000,0x1054,0x0000,0x0000,0x0000,0x1058,0x0000,0x0000,0x0000,0x1bca,0x0000,0x0000,0x0000,0x0000,0x105c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1060,0x0000,0x0000,0x0000,0x1064,0x0000,0x0000,0x0000,0x1068,0x0000,0x0000,0x0000,0x106c,0x0000,0x0000,0x0000,0x1070,0x0000,0x0000,0x0000,0x1074,0x0000,0x0000,0x0000,0x1078,0x0000,0x0000,0x0000,0x107c,0x0000,0x0000,0x0000,0x1080,0x0000,0x0000,0x0000,0x1084,0x0000,0x0000,0x0000,0x1bfe,0x0000,0x0000,0x1088,0x1088,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c0a,0x0000,0x0000,0x108c,0x1090,0x108c,0x1090,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c16,0x0000,0x0000,0x1094,0x0000,0x1094,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c22,0x0000,0x0000,0x1098,0x109c,0x1098,0x109c,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c2e,0x0000,0x0000,0x10a0,0x0000,0x10a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c3a,0x0000,0x0000,0x10a4,0x0000,0x10a4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c45,0x0000,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x1c56,0x0000,0x0000,0x0000,0x10a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c62,0x0000,0x0000,0x10ac,0x0000,0x10ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c6e,0x0000,0x0000,0x10b0,0x0000,0x10b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c79,0x0000,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x1c8a,0x0000,0x10b4,0x10b8,0x10b4,0x10b8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c95,0x0000,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x1ca6,0x0000,0x10bc,0x10c0,0x10bc,0x10c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1cb1,0x0000,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x1cc2,0x0000,0x10c4,0x10c8,0x10c4,0x10c8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ccd,0x0000,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x1cde,0x0000,0x10cc,0x10d0,0x10cc,0x10d0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ce9,0x0000,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x1cfa,0x0000,0x10d4,0x10d8,0x10d4,0x10d8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d05,0x0000,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x1d16,0x0000,0x10dc,0x10e0,0x10dc,0x10e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d22,0x0000,0x0000,0x10e4,0x10e8,0x10e4,0x10e8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d2e,0x0000,0x0000,0x10ec,0x10f0,0x10ec,0x10f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d3a,0x0000,0x0000,0x10f4,0x10f8,0x10f4,0x10f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d46,0x0000,0x0000,0x10fc,0x1100,0x10fc,0x1100,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d52,0x0000,0x0000,0x1104,0x1108,0x1104,0x1108,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d5e,0x0000,0x0000,0x110c,0x1110,0x110c,0x1110,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d6a,0x0000,0x0000,0x1114,0x1118,0x1114,0x1118,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d76,0x0000,0x0000,0x111c,0x1120,0x111c,0x1120,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d82,0x0000,0x0000,0x1124,0x1128,0x1124,0x1128,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d8e,0x0000,0x0000,0x112c,0x1130,0x112c,0x1130,0x0000,0x0000,0x0000,0x0000,0x0000,0x1d9a,0x0000,0x0000,0x1134,0x1138,0x1134,0x1138,0x0000,0x0000,0x0000,0x0000,0x0000,0x1da6,0x0000,0x0000,0x113c,0x1140,0x113c,0x1140,0x0000,0x0000,0x0000,0x0000,0x0000,0x1db2,0x0000,0x0000,0x1144,0x1148,0x1144,0x1148,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dbe,0x0000,0x0000,0x114c,0x1150,0x114c,0x1150,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dca,0x0000,0x0000,0x1154,0x1158,0x1154,0x1158,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dd6,0x0000,0x0000,0x115c,0x1160,0x115c,0x1160,0x0000,0x0000,0x0000,0x0000,0x0000,0x1de2,0x0000,0x0000,0x1164,0x1168,0x1164,0x1168,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dee,0x0000,0x0000,0x116c,0x1170,0x116c,0x1170,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dfa,0x0000,0x0000,0x1174,0x1178,0x1174,0x1178,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e06,0x0000,0x0000,0x117c,0x1180,0x117c,0x1180,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e12,0x0000,0x0000,0x1184,0x1188,0x1184,0x1188,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e1e,0x0000,0x0000,0x118c,0x1190,0x118c,0x1190,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e2a,0x0000,0x0000,0x1194,0x1198,0x1194,0x1198,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e36,0x0000,0x0000,0x119c,0x11a0,0x119c,0x11a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e42,0x0000,0x0000,0x11a4,0x11a8,0x11a4,0x11a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e4e,0x0000,0x0000,0x11ac,0x11b0,0x11ac,0x11b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e5a,0x0000,0x0000,0x11b4,0x11b8,0x11b4,0x11b8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e66,0x0000,0x0000,0x11bc,0x11c0,0x11bc,0x11c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e72,0x0000,0x0000,0x11c4,0x11c8,0x11c4,0x11c8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e7e,0x0000,0x0000,0x11cc,0x11d0,0x11cc,0x11d0,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e8a,0x0000,0x0000,0x0000,0x0000,0x0000,0x11d4,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e96,0x0000,0x0000,0x0000,0x0000,0x0000,0x11d8,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ea2,0x0000,0x0000,0x11dc,0x0000,0x11dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1eae,0x0000,0x0000,0x11e0,0x0000,0x11e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1eba,0x0000,0x0000,0x11e4,0x0000,0x11e4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ec6,0x0000,0x0000,0x0000,0x0000,0x11e8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x11ec,0x0000,0x0000,0x0000,0x11f0,0x0000,0x0000,0x0000,0x11f4,0x0000,0x0000,0x0000,0x11f8,0x0000,0x0000,0x0000,0x11fc,0x0000,0x0000,0x0000,0x1200,0x0000,0x0000,0x0000,0x1204,0x0000,0x0000,0x0000,0x1208,0x0000,0x0000,0x0000,0x1ef1,0x0000,0x0000,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x1f02,0x1f0a,0x120c,0x120c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1210,0x1210,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f15,0x0000,0x0000,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1f26,0x1f2e,0x1214,0x1214,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1218,0x1218,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f3a,0x0000,0x0000,0x121c,0x121c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f46,0x0000,0x0000,0x121c,0x1220,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f52,0x0000,0x0000,0x1224,0x1224,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f5e,0x0000,0x0000,0x0000,0x0000,0x1228,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f6a,0x0000,0x0000,0x0000,0x0000,0x122c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f76,0x0000,0x0000,0x1230,0x0000,0x1230,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f82,0x0000,0x0000,0x1234,0x1234,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f8e,0x0000,0x0000,0x1238,0x1238,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1f9a,0x0000,0x0000,0x123c,0x123c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fa6,0x0000,0x0000,0x123c,0x1240,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fb2,0x0000,0x0000,0x0000,0x0000,0x1244,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fbe,0x0000,0x0000,0x0000,0x0000,0x1248,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x124c,0x0000,0x0000,0x0000,0x1fce,0x0000,0x0000,0x1250,0x1250,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1254,0x0000,0x0000,0x0000,0x1258,0x0000,0x0000,0x0000,0x1fe2,0x0000,0x0000,0x0000,0x0000,0x125c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1fee,0x0000,0x0000,0x1260,0x0000,0x1260,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ffa,0x0000,0x0000,0x1264,0x0000,0x1264,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2006,0x0000,0x0000,0x1268,0x0000,0x1268,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2012,0x0000,0x0000,0x126c,0x126c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x201e,0x0000,0x0000,0x1270,0x1270,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x202a,0x0000,0x0000,0x1274,0x1274,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2036,0x0000,0x0000,0x1278,0x1278,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2042,0x0000,0x0000,0x0000,0x127c,0x127c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x204d,0x0000,0x0000,0x0000,0x0000,0x0000,0x205e,0x205e,0x2066,0x2066,0x206e,0x206e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1280,0x1280,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1284,0x1284,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1288,0x1288,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x207a,0x20b6,0x20c6,0x20be,0x128c,0x128c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2086,0x1290,0x1290,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2092,0x0000,0x20a2,0x209a,0x1294,0x1294,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1298,0x1298,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x129c,0x129c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x20ae,0x12a0,0x12a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x12a4,0x12a4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x12a8,0x12a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x12ac,0x12ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x21d9,0x12b0,0x12b4,0x0000,0x12b8,0x12d8,0x12bc,0x12dc,0x12c0,0x12e0,0x12c4,0x12e4,0x12c8,0x12e8,0x12cc,0x12ec,0x12d0,0x12f0,0x12d4,0x12f4,0x12f8,0x1314,0x0000,0x1318,0x12fc,0x20f1,0x1300,0x0000,0x1304,0x20f9,0x1308,0x2101,0x130c,0x2109,0x1310,0x2111,0x131c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1320,0x1324,0x0000,0x0000,0x1328,0x132c,0x0000,0x0000,0x1330,0x1334,0x1338,0x133c,0x1340,0x1344,0x1348,0x0000,0x134c,0x1350,0x1354,0x1358,0x135c,0x1360,0x1364,0x1368,0x136c,0x1370,0x1374,0x1378,0x137c,0x1380,0x1384,0x1388,0x138c,0x13ac,0x1390,0x13b0,0x1394,0x13b4,0x1398,0x13b8,0x139c,0x0000,0x13a0,0x2129,0x13a4,0x0000,0x13a8,0x0000,0x0000,0x13bc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x13c0,0x13d8,0x13c4,0x13dc,0x13c8,0x13e0,0x13cc,0x13e4,0x0000,0x2141,0x13d0,0x13f0,0x0000,0x13f4,0x13d4,0x0000,0x0000,0x0000,0x13e8,0x13ec,0x0000,0x0000,0x0000,0x0000,0x13f8,0x1418,0x13fc,0x141c,0x1400,0x0000,0x1404,0x0000,0x1408,0x1420,0x140c,0x1424,0x1410,0x1428,0x1414,0x142c,0x1430,0x144c,0x1434,0x0000,0x1438,0x1450,0x143c,0x1454,0x1440,0x1458,0x0000,0x145c,0x1444,0x0000,0x1448,0x0000,0x1460,0x1480,0x1464,0x1484,0x1468,0x0000,0x146c,0x2179,0x1470,0x148c,0x1474,0x1490,0x1478,0x1494,0x147c,0x1498,0x0000,0x1488,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x149c,0x0000,0x14a0,0x0000,0x14a4,0x0000,0x14a8,0x0000,0x14ac,0x2191,0x14b0,0x14c0,0x14b4,0x14c4,0x14b8,0x0000,0x14bc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x14cc,0x0000,0x14d0,0x0000,0x0000,0x0000,0x0000,0x0000,0x14cc,0x0000,0x14d0,0x0000,0x16c0,0x16c4,0x16c8,0x16cc,0x04b0,0x04b0,0x21ad,0x04b0,0x04b0,0x04b0,0x04b0,0x14d4,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x21bd,0x04b0,0x04b0,0x14d8,0x14dc,0x04b0,0x04b0,0x04b0,0x04b0,0x0000,0x21c9,0x0000,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e0,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x14e4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x15c4,0x15c4,0x0000,0x14ec,0x14e8,0x15bc,0x0000,0x0000,0x0000,0x1604,0x0000,0x1608,0x0000,0x160c,0x0000,0x1610,0x15c4,0x15c4,0x0000,0x14ec,0x14e8,0x15bc,0x0000,0x0000,0x220d,0x04b0,0x04b0,0x04b0,0x14f0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x04b0,0x0000,0x0000,0x2221,0x0000,0x0000,0x2231,0x0000,0x2239,0x0000,0x2241,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x14f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x14f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x14fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x224d,0x224d,0x2265,0x0000,0x0000,0x225d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1500,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2275,0x0000,0x227d,0x0000,0x2285,0x0000,0x228d,0x0000,0x2295,0x0000,0x229d,0x0000,0x0000,0x0000,0x0000,0x1504,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1508,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x150c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1510,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1514,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1518,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x22a9,0x0000,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x151c,0x0000,0x0000,0x22bd,0x0000,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x1520,0x0000,0x071d,0x22d1,0x22e1,0x22f1,0x0000,0x0000,0x0650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1528,0x1638,0x0000,0x163c,0x0000,0x0000,0x0650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x154c,0x0000,0x0000,0x1640,0x0000,0x0000,0x0650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x071d,0x22d1,0x2305,0x22f1,0x0000,0x0000,0x0650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x154c,0x16d0,0x0000,0x1640,0x0000,0x0000,0x0000,0x0000,0x1550,0x1554,0x1558,0x155c,0x1568,0x156c,0x1574,0x1578,0x157c,0x1580,0x1584,0x1588,0x1568,0x1570,0x1574,0x1578,0x157c,0x1580,0x1584,0x1588,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1620,0x15b8,0x1628,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x15c0,0x0000,0x0000,0x0000,0x15c8,0x0000,0x0000,0x0000,0x15cc,0x0000,0x0000,0x0000,0x15d0,0x0000,0x0000,0x0000,0x235e,0x0000,0x0000,0x15d4,0x0000,0x15d4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x236a,0x0000,0x0000,0x0000,0x15d8,0x0000,0x15d8,0x0000,0x0000,0x0000,0x0000,0x0000,0x2376,0x0000,0x0000,0x0000,0x15dc,0x0000,0x15dc,0x0000,0x0000,0x0000,0x0000,0x35d7,0x0000,0x0000,0x0000,0x34fb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x359f,0x3d5b,0x3d67,0x0000,0x0000,0x3ee7,0x3f03,0x3f1f,0x3867,0x3f53,0x3f6f,0x3d8b,0x0000,0x37bf,0x37cb,0x37d7,0x37f3,0x338f,0x3393,0x3397,0x33a3,0x3553,0x3557,0x355b,0x355f,0x3563,0x3567,0x40a7,0x40b3,0x3593,0x343b,0x321f,0x33c3,0x415f,0x416b,0x0000,0x0000,0x3573,0x3577,0x357b,0x357f,0x3583,0x3587,0x3d2b,0x345b,0x3513,0x3517,0x3523,0x3527,0x3533,0x3537,0x3543,0x3547,0x35af,0x0000,0x3aeb,0x3af7,0x3e53,0x408f,0x407b,0x4067,0x0000,0x0000,0x0000,0x0000,0x40e7,0x40f3,0x4147,0x4153,0x3cf3,0x3cff,0x38bb,0x3d13,0x3f87,0x3f93,0x0000,0x0000,0x3bef,0x3bfb,0x3c07,0x3c23,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3dd3,0x3c9f,0x3b63,0x37b3,0x3b57,0x0000,0x3b4b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x400f,0x401b,0x3833,0x4047,0x0000,0x3d37,0x3d43,0x3d4f,0x3bd7,0x3be3,0x3b6f,0x3b8b,0x3ba7,0x3daf,0x3dbb,0x3dc7,0x0000,0x0000,0x0000,0x3f7b,0x0000,0x0000,0x0000,0x0000,0x38c7,0x3df7,0x380f,0x3cc3,0x0000,0x3d1f,0x0000,0x4053,0x3e1b,0x3e37,0x3ab3,0x3acf,0x0000,0x0000,0x3933,0x393f,0x394b,0x3957,0x3963,0x396f,0x397b,0x3987,0x3993,0x399f,0x3fbf,0x3fdb,0x4177,0x4193,0x0000,0x0000,0x39ab,0x39b7,0x39c3,0x39cf,0x39db,0x39e7,0x39f3,0x39ff,0x3a0b,0x3a17,0x0000,0x0000,0x0000,0x0000,0x3e5f,0x3e6b,0x3a23,0x3a2f,0x3a3b,0x3a47,0x3a53,0x3a5f,0x3a6b,0x3a77,0x3a83,0x3a8f,0x0000,0x0000,0x0000,0x0000,0x3ce7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x247f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e2b,0x0000,0x2f63,0x2f67,0x2f6b,0x2f6f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2482,0x0000,0x0000,0x15e0,0x0000,0x15e0,0x0000,0x15e0,0x0000,0x15e0,0x0000,0x0000,0x2e3e,0x2492,0x2592,0x0000,0x45be,0x48a2,0x0000,0x35d7,0x0000,0x0000,0x0000,0x34fb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x359f,0x3d5b,0x3d67,0x0000,0x0000,0x3ee7,0x3f03,0x3f1f,0x3867,0x3f53,0x3f6f,0x3d8b,0x0000,0x37bf,0x37cb,0x37d7,0x37f3,0x338f,0x3393,0x3397,0x33a3,0x3553,0x3557,0x355b,0x355f,0x3563,0x3567,0x40a7,0x40b3,0x3593,0x343b,0x321f,0x33c3,0x415f,0x416b,0x0000,0x0000,0x3573,0x3577,0x357b,0x357f,0x3583,0x3587,0x3d2b,0x345b,0x3513,0x3517,0x3523,0x3527,0x3533,0x3537,0x3543,0x3547,0x35af,0x0000,0x3aeb,0x3af7,0x3e53,0x408f,0x407b,0x4067,0x0000,0x0000,0x0000,0x0000,0x40e7,0x40f3,0x4147,0x4153,0x3cf3,0x3cff,0x38bb,0x3d13,0x3f87,0x3f93,0x0000,0x0000,0x3bef,0x3bfb,0x3c07,0x3c23,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3dd3,0x3c9f,0x3b63,0x37b3,0x3b57,0x0000,0x3b4b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x400f,0x401b,0x3833,0x4047,0x0000,0x3d37,0x3d43,0x3d4f,0x3bd7,0x3be3,0x3b6f,0x3b8b,0x3bbb,0x3daf,0x3dbb,0x3dc7,0x0000,0x0000,0x0000,0x3f7b,0x0000,0x0000,0x0000,0x0000,0x38c7,0x3df7,0x380f,0x3cc3,0x0000,0x3d1f,0x0000,0x4053,0x3e1b,0x3e37,0x3ab3,0x3acf,0x0000,0x0000,0x3933,0x393f,0x394b,0x3957,0x3963,0x396f,0x397b,0x3987,0x3993,0x399f,0x3fbf,0x3fdb,0x4177,0x4193,0x0000,0x0000,0x39ab,0x39b7,0x39c3,0x39cf,0x39db,0x39e7,0x39f3,0x39ff,0x3a0b,0x3a17,0x0000,0x0000,0x0000,0x0000,0x3e5f,0x3e6b,0x3a23,0x3a2f,0x3a3b,0x3a47,0x3a53,0x3a5f,0x3a6b,0x3a77,0x3a83,0x3a8f,0x0000,0x0000,0x0000,0x0000,0x3ce7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x247f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e2b,0x0000,0x2f63,0x2f67,0x2f6b,0x2f6f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3d97,0x3da3,0x0000,0x37a7,0x3d73,0x3d7f,0x0000,0x0000,0x4117,0x4123,0x412f,0x413b,0x0000,0x0000,0x0000,0x33ff,0x0000,0x0000,0x0000,0x0000,0x3467,0x34a7,0x34cb,0x305f,0x3b1b,0x38eb,0x3b27,0x38f7,0x0000,0x3873,0x3c6f,0x3c7b,0x34d7,0x306b,0x34ef,0x41af,0x0000,0x409b,0x3b03,0x3b0f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b33,0x3903,0x3b3f,0x390f,0x0000,0x0000,0x3c87,0x3c93,0x0000,0x0000,0x38af,0x41bb,0x3423,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x40cf,0x40db,0x0000,0x0000,0x391b,0x3927,0x40ff,0x410b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3a9b,0x3aa7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3ff7,0x4003,0x4027,0x4033,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x45ab,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2693,0x269f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2696,0x0000,0x0000,0x0000,0x15e4,0x0000,0x15e4,0x0000,0x15e4,0x0000,0x15e4,0x0000,0x26a2,0x0000,0x0000,0x0000,0x15e8,0x0000,0x15e8,0x0000,0x15e8,0x0000,0x15e8,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x0000,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15ec,0x17b0,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x0000,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x15f0,0x17b4,0x0498,0x0498,0x15f8,0x0498,0x16bc,0x0000,0x0000,0x0000,0x0000,0x0000,0x15fc,0x1600,0x0000,0x26f9,0x0000,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1644,0x0000,0x1648,0x0000,0x0000,0x0000,0x164c,0x0000,0x0000,0x0000,0x1650,0x0000,0x0000,0x0000,0x1654,0x0000,0x0000,0x0000,0x1658,0x0000,0x0000,0x0000,0x165c,0x0000,0x0000,0x0000,0x1660,0x0000,0x0000,0x0000,0x1664,0x1668,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2732,0x273a,0x2742,0x274a,0x166c,0x0000,0x166c,0x0000,0x0000,0x0000,0x0000,0x0000,0x1670,0x0000,0x1670,0x0000,0x0000,0x0000,0x0000,0x0000,0x1674,0x0000,0x1674,0x0000,0x0000,0x0000,0x0000,0x0000,0x1678,0x0000,0x1678,0x0000,0x0000,0x0000,0x0000,0x0000,0x2756,0x275e,0x2766,0x276e,0x167c,0x0000,0x167c,0x0000,0x0000,0x0000,0x0000,0x0000,0x1680,0x0000,0x1680,0x0000,0x0000,0x0000,0x0000,0x0000,0x1684,0x0000,0x1684,0x0000,0x0000,0x0000,0x0000,0x0000,0x1688,0x0000,0x1688,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x277a,0x0000,0x0000,0x168c,0x0000,0x168c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2786,0x0000,0x0000,0x1690,0x0000,0x1690,0x0000,0x0000,0x0000,0x0000,0x0000,0x2791,0x27a9,0x27c1,0x27d9,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x27a2,0x0000,0x1694,0x0000,0x1694,0x0000,0x0000,0x0000,0x0000,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x27ba,0x0000,0x1698,0x0000,0x1698,0x0000,0x0000,0x0000,0x0000,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x27d2,0x0000,0x169c,0x0000,0x169c,0x0000,0x0000,0x0000,0x0000,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x27ea,0x0000,0x16a0,0x0000,0x16a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x27f5,0x280d,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x2806,0x0000,0x16a4,0x0000,0x16a4,0x0000,0x0000,0x0000,0x0000,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x281e,0x0000,0x16a8,0x0000,0x16a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x282a,0x0000,0x16ac,0x0000,0x16ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2836,0x0000,0x0000,0x0000,0x16b0,0x0000,0x16b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x2842,0x0000,0x0000,0x0000,0x16b4,0x0000,0x16b4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x284d,0x0000,0x0000,0x285d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x16b8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x16d8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x16dc,0x0000,0x2879,0x2889,0x2899,0x28a9,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e0,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e4,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16e8,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x16ec,0x0000,0x0000,0x28bd,0x0000,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x28ce,0x0000,0x16f0,0x16f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x28d9,0x0000,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x28ea,0x0000,0x16f4,0x16f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x28f5,0x0000,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x2906,0x0000,0x16f8,0x16f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2911,0x0000,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x2922,0x0000,0x16fc,0x16fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x292d,0x0000,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x293e,0x0000,0x1700,0x1700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2949,0x0000,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x295a,0x0000,0x1704,0x1704,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2965,0x0000,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x2976,0x0000,0x1708,0x1708,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2981,0x0000,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x2992,0x0000,0x170c,0x170c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x299d,0x0000,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x29ae,0x0000,0x1710,0x1710,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x29b9,0x0000,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x29ca,0x0000,0x1714,0x1714,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x29d5,0x0000,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x29e6,0x0000,0x1718,0x1718,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x29f1,0x0000,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x2a02,0x0000,0x171c,0x171c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a0d,0x0000,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x2a1e,0x0000,0x1720,0x1720,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a29,0x0000,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x2a3a,0x0000,0x1724,0x1724,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a45,0x0000,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x2a56,0x0000,0x1728,0x1728,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a61,0x0000,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x2a72,0x0000,0x172c,0x172c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2a7d,0x0000,0x1730,0x0000,0x1734,0x0000,0x1738,0x0000,0x173c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1740,0x1744,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x1748,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x174c,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x1750,0x0000,0x0000,0x0000,0x2ad1,0x0000,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x1754,0x0000,0x0000,0x2ae5,0x0000,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0000,0x1758,0x0479,0x0479,0x0479,0x2af9,0x0414,0x0414,0x0418,0x0418,0x041c,0x041c,0x0420,0x0420,0x0424,0x0424,0x0428,0x0428,0x175c,0x175c,0x0000,0x0000,0x0000,0x0000,0x1760,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1764,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b1d,0x2b35,0x0000,0x2b5d,0x2b2e,0x2b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1768,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b46,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x176c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b56,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1770,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x0000,0x2b6d,0x2b76,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1774,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b81,0x2ba1,0x2bc1,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x2b91,0x0000,0x0000,0x0000,0x0000,0x0000,0x2b9a,0x0000,0x0000,0x0000,0x1778,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x2bb1,0x0000,0x0000,0x0000,0x0000,0x0000,0x2bba,0x0000,0x0000,0x0000,0x177c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x2bd1,0x0000,0x0000,0x0000,0x0000,0x0000,0x2bda,0x0000,0x0000,0x0000,0x1780,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2be5,0x2bfd,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x0000,0x2bf6,0x1784,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x0000,0x2c0e,0x1788,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c19,0x2c31,0x2c49,0x2c61,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x0000,0x2c2a,0x178c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x0000,0x2c42,0x1790,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x0000,0x2c5a,0x1794,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x0000,0x2c72,0x1798,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2c7d,0x2c95,0x0000,0x0000,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x0000,0x2c8e,0x179c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x0000,0x2ca6,0x17a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2daf,0x0000,0x2de3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2dc9,0x2db1,0x0000,0x2dc2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x17a8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2dda,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x17ac,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2dfd,0x2de5,0x0000,0x2df6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x17b8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e0e,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x17bc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e1a,0x2e22,0x17c0,0x0000,0x17c0,0x0000,0x0000,0x0000,0x0000,0x0000,0x17c4,0x0000,0x17c4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2e2e,0x2e36,0x17c0,0x0000,0x17c0,0x0000,0x17c0,0x0000,0x17c0,0x0000,0x17c4,0x0000,0x17c4,0x0000,0x17c4,0x0000,0x17c4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x329f,0x32e3,0x30ff,0x317b,0x377f,0x3793,0x31af,0x31eb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30bf,0x30d3,0x3023,0x3257,0x3037,0x300f,0x376b,0x2fbf,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3723,0x0000,0x0000,0x2f73,0x2f87,0x337b,0x41c7,0x2f3f,0x3357,0x2ffb,0x2fe7,0x3747,0x309b,0x303b,0x3077,0x36c3,0x36c7,0x36cb,0x33af,0x3447,0x344b,0x344f,0x33b3,0x36e3,0x36e7,0x36eb,0x33b7,0x36d7,0x36f7,0x30f3,0x310b,0x35db,0x35e7,0x35fb,0x3627,0x3427,0x342b,0x342f,0x0000,0x388b,0x3853,0x387f,0x3847,0x0000,0x0000,0x30e7,0x3117,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2f9b,0x0000,0x34e3,0x348b,0x370f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x364b,0x364f,0x365b,0x33e3,0x35ab,0x3293,0x0000,0x36bb,0x36bf,0x3503,0x3403,0x33f7,0x33fb,0x3507,0x340f,0x341b,0x3667,0x366b,0x341f,0x35a3,0x35a7,0x2fd3,0x323b,0x36b3,0x36b7,0x350b,0x35c7,0x33ef,0x33f3,0x350f,0x3703,0x0000,0x3677,0x367b,0x3687,0x35bb,0x34ff,0x35d3,0x0000,0x3693,0x3697,0x369b,0x36a7,0x33cf,0x33d3,0x33d7,0x0000,0x2f42,0x2f4a,0x2f52,0x2f5a,0x17c8,0x0000,0x17c8,0x0000,0x17c8,0x0000,0x17c8,0x0000,0x0000,0x17cc,0x0000,0x17cc,0x0000,0x17cc,0x0000,0x17cc,0x17d0,0x0000,0x17d0,0x0000,0x17d0,0x0000,0x17d0,0x0000,0x0000,0x17d4,0x0000,0x17d4,0x0000,0x17d4,0x0000,0x17d4,0x0000,0x17d8,0x0000,0x0000,0x0000,0x17dc,0x0000,0x0000,0x0000,0x17e0,0x0000,0x0000,0x0000,0x17e4,0x0000,0x0000,0x2f76,0x2f7e,0x0000,0x0000,0x17e8,0x0000,0x17e8,0x0000,0x17e8,0x0000,0x17e8,0x0000,0x0000,0x17ec,0x0000,0x17ec,0x0000,0x17ec,0x0000,0x17ec,0x2f8a,0x2f92,0x0000,0x0000,0x17f0,0x0000,0x17f0,0x0000,0x17f0,0x0000,0x17f0,0x0000,0x0000,0x17f4,0x0000,0x17f4,0x0000,0x17f4,0x0000,0x17f4,0x2f9e,0x2fa6,0x2fae,0x2fb6,0x17f8,0x0000,0x17f8,0x0000,0x17f8,0x0000,0x17f8,0x0000,0x0000,0x17fc,0x0000,0x17fc,0x0000,0x17fc,0x0000,0x17fc,0x1800,0x0000,0x1800,0x0000,0x1800,0x0000,0x1800,0x0000,0x0000,0x1804,0x0000,0x1804,0x0000,0x1804,0x0000,0x1804,0x2fc2,0x2fca,0x0000,0x0000,0x1808,0x0000,0x1808,0x0000,0x1808,0x0000,0x1808,0x0000,0x0000,0x180c,0x0000,0x180c,0x0000,0x180c,0x0000,0x180c,0x0000,0x3026,0x2fd6,0x2fde,0x1810,0x1bfc,0x1810,0x1bfc,0x1810,0x1bfc,0x1810,0x1bfc,0x0000,0x1814,0x0000,0x1814,0x0000,0x1814,0x0000,0x1814,0x2fea,0x2ff2,0x302e,0x0000,0x1818,0x1c00,0x1818,0x1c00,0x1818,0x1c00,0x1818,0x1c00,0x181c,0x0000,0x181c,0x0000,0x181c,0x0000,0x181c,0x0000,0x2ffe,0x3006,0x3012,0x301a,0x1820,0x0000,0x1820,0x0000,0x1820,0x0000,0x1820,0x0000,0x0000,0x1824,0x0000,0x1824,0x0000,0x1824,0x0000,0x1824,0x0000,0x0000,0x1828,0x182c,0x1830,0x0000,0x1830,0x0000,0x1830,0x0000,0x1830,0x0000,0x0000,0x1834,0x0000,0x1834,0x0000,0x1834,0x0000,0x1834,0x0000,0x0000,0x1838,0x183c,0x0000,0x1840,0x0000,0x1840,0x0000,0x1840,0x0000,0x1840,0x1844,0x0000,0x1844,0x0000,0x1844,0x0000,0x1844,0x0000,0x0000,0x0000,0x184c,0x1848,0x303e,0x3046,0x304e,0x3056,0x1850,0x0000,0x1850,0x0000,0x1850,0x0000,0x1850,0x0000,0x0000,0x1854,0x0000,0x1854,0x0000,0x1854,0x0000,0x1854,0x1858,0x0000,0x1858,0x0000,0x1858,0x0000,0x1858,0x0000,0x0000,0x185c,0x0000,0x185c,0x0000,0x185c,0x0000,0x185c,0x0000,0x3062,0x0000,0x0000,0x1860,0x1860,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x306e,0x0000,0x0000,0x1864,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x307a,0x3082,0x308a,0x3092,0x1868,0x0000,0x1868,0x0000,0x1868,0x0000,0x1868,0x0000,0x0000,0x186c,0x0000,0x186c,0x0000,0x186c,0x0000,0x186c,0x1870,0x0000,0x1870,0x0000,0x1870,0x0000,0x1870,0x0000,0x0000,0x1874,0x0000,0x1874,0x0000,0x1874,0x0000,0x1874,0x309e,0x30a6,0x30ae,0x30b6,0x1878,0x0000,0x1878,0x0000,0x1878,0x0000,0x1878,0x0000,0x0000,0x187c,0x0000,0x187c,0x0000,0x187c,0x0000,0x187c,0x1880,0x0000,0x1880,0x0000,0x1880,0x0000,0x1880,0x0000,0x0000,0x1884,0x0000,0x1884,0x0000,0x1884,0x0000,0x1884,0x30c2,0x30ca,0x0000,0x0000,0x1888,0x0000,0x1888,0x0000,0x1888,0x0000,0x1888,0x0000,0x0000,0x188c,0x0000,0x188c,0x0000,0x188c,0x0000,0x188c,0x30d6,0x30de,0x0000,0x0000,0x1890,0x0000,0x1890,0x0000,0x1890,0x0000,0x1890,0x0000,0x0000,0x1894,0x0000,0x1894,0x0000,0x1894,0x0000,0x1894,0x0000,0x30ea,0x328a,0x0000,0x1898,0x1898,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30f6,0x0000,0x0000,0x189c,0x189c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3141,0x3161,0x3326,0x3102,0x0000,0x18a0,0x0000,0x18a4,0x0000,0x18a4,0x0000,0x0000,0x0000,0x310e,0x3122,0x3132,0x18a8,0x18ac,0x18a8,0x18ac,0x18a8,0x18ac,0x18a8,0x18ac,0x0000,0x311a,0x312a,0x313a,0x18b0,0x18b4,0x18b0,0x18b4,0x18b0,0x18b4,0x18b0,0x18b4,0x18b8,0x18bc,0x18b8,0x18bc,0x18b8,0x18bc,0x18b8,0x18bc,0x18c0,0x18c4,0x18c0,0x18c4,0x18c0,0x18c4,0x18c0,0x18c4,0x18c8,0x18cc,0x18c8,0x18cc,0x18c8,0x18cc,0x18c8,0x18cc,0x18d0,0x18d4,0x18d0,0x18d4,0x18d0,0x18d4,0x18d0,0x18d4,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x3152,0x315a,0x18d8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18dc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x3172,0x0000,0x0000,0x18e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x317d,0x3195,0x0000,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x318e,0x0000,0x18e4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x31a6,0x0000,0x0000,0x18e8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31b1,0x31d1,0x332e,0x0000,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x31c2,0x31ca,0x18ec,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x31e2,0x0000,0x0000,0x18f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31ed,0x3205,0x0000,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x31fe,0x0000,0x18f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x3216,0x0000,0x0000,0x18fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3221,0x3c3d,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x3232,0x0000,0x1900,0x0000,0x1900,0x0000,0x1900,0x0000,0x1900,0x0000,0x0000,0x323d,0x0000,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x324e,0x0000,0x1904,0x0000,0x1904,0x0000,0x1904,0x0000,0x1904,0x0000,0x3259,0x3271,0x0000,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x326a,0x0000,0x1908,0x0000,0x1908,0x0000,0x1908,0x0000,0x1908,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x3282,0x0000,0x0000,0x190c,0x0000,0x190c,0x0000,0x190c,0x0000,0x190c,0x0000,0x1910,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3296,0x0000,0x0000,0x0000,0x1914,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3336,0x333e,0x32a1,0x32c1,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x32b2,0x32ba,0x1918,0x0000,0x1918,0x0000,0x1918,0x0000,0x1918,0x0000,0x191c,0x0000,0x191c,0x0000,0x191c,0x0000,0x191c,0x0000,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x32d2,0x32da,0x0000,0x1920,0x0000,0x1920,0x0000,0x1920,0x0000,0x1920,0x0000,0x1924,0x0000,0x1924,0x0000,0x1924,0x0000,0x1924,0x3346,0x334e,0x32e5,0x3305,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x32f6,0x32fe,0x1928,0x0000,0x1928,0x0000,0x1928,0x0000,0x1928,0x0000,0x192c,0x0000,0x192c,0x0000,0x192c,0x0000,0x192c,0x0000,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x3316,0x331e,0x0000,0x1930,0x0000,0x1930,0x0000,0x1930,0x0000,0x1930,0x0000,0x1934,0x0000,0x1934,0x0000,0x1934,0x0000,0x1934,0x1938,0x0000,0x1938,0x0000,0x1938,0x0000,0x1938,0x0000,0x193c,0x0000,0x193c,0x0000,0x193c,0x0000,0x193c,0x0000,0x1940,0x0000,0x1940,0x0000,0x1940,0x0000,0x1940,0x0000,0x0000,0x1944,0x0000,0x1944,0x0000,0x1944,0x0000,0x1944,0x1948,0x0000,0x1948,0x0000,0x1948,0x0000,0x1948,0x0000,0x0000,0x194c,0x0000,0x194c,0x0000,0x194c,0x0000,0x194c,0x335a,0x3362,0x336a,0x3372,0x1950,0x0000,0x1950,0x0000,0x1950,0x0000,0x1950,0x0000,0x0000,0x1954,0x0000,0x1954,0x0000,0x1954,0x0000,0x1954,0x1958,0x0000,0x1958,0x0000,0x1958,0x0000,0x1958,0x0000,0x0000,0x195c,0x0000,0x195c,0x0000,0x195c,0x0000,0x195c,0x337e,0x3386,0x0000,0x0000,0x1960,0x0000,0x1960,0x0000,0x1960,0x0000,0x1960,0x0000,0x0000,0x1964,0x0000,0x1964,0x0000,0x1964,0x0000,0x1964,0x0000,0x1968,0x0000,0x0000,0x0000,0x196c,0x0000,0x0000,0x0000,0x339a,0x0000,0x0000,0x1970,0x0000,0x1970,0x0000,0x1970,0x0000,0x1970,0x0000,0x0000,0x33a6,0x0000,0x0000,0x0000,0x1974,0x0000,0x1974,0x0000,0x1974,0x0000,0x1974,0x0000,0x1978,0x0000,0x0000,0x0000,0x197c,0x0000,0x0000,0x0000,0x33ba,0x0000,0x0000,0x1980,0x0000,0x1980,0x0000,0x1980,0x0000,0x1980,0x0000,0x0000,0x33c6,0x0000,0x0000,0x1984,0x0000,0x1984,0x0000,0x1984,0x0000,0x1984,0x0000,0x0000,0x1988,0x0000,0x0000,0x0000,0x198c,0x0000,0x0000,0x0000,0x33da,0x0000,0x0000,0x1990,0x0000,0x1990,0x0000,0x1990,0x0000,0x1990,0x0000,0x0000,0x33e6,0x0000,0x0000,0x0000,0x1994,0x0000,0x1994,0x0000,0x1994,0x0000,0x1994,0x0000,0x1998,0x0000,0x0000,0x0000,0x199c,0x0000,0x0000,0x0000,0x19a0,0x0000,0x0000,0x0000,0x19a4,0x0000,0x0000,0x0000,0x19a8,0x0000,0x0000,0x0000,0x3406,0x0000,0x0000,0x19ac,0x19b0,0x19ac,0x19b0,0x19ac,0x19b0,0x19ac,0x19b0,0x0000,0x3412,0x0000,0x0000,0x19b4,0x19b8,0x19b4,0x19b8,0x19b4,0x19b8,0x19b4,0x19b8,0x0000,0x19bc,0x0000,0x0000,0x0000,0x19c0,0x0000,0x0000,0x0000,0x19c4,0x0000,0x0000,0x0000,0x19c8,0x0000,0x0000,0x0000,0x19cc,0x0000,0x0000,0x0000,0x3432,0x0000,0x0000,0x19d0,0x0000,0x19d0,0x0000,0x19d0,0x0000,0x19d0,0x0000,0x0000,0x343e,0x3e75,0x0000,0x0000,0x19d4,0x0000,0x19d4,0x0000,0x19d4,0x0000,0x19d4,0x0000,0x19d8,0x0000,0x0000,0x0000,0x19dc,0x0000,0x0000,0x0000,0x3452,0x0000,0x0000,0x19e0,0x0000,0x19e0,0x0000,0x19e0,0x0000,0x19e0,0x0000,0x0000,0x345e,0x0000,0x0000,0x0000,0x19e4,0x0000,0x19e4,0x0000,0x19e4,0x0000,0x19e4,0x0000,0x3469,0x0000,0x0000,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x347a,0x3482,0x19e8,0x19e8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x19ec,0x19ec,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x348d,0x0000,0x0000,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x0000,0x349e,0x19f0,0x19f0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x34a9,0x0000,0x0000,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x34ba,0x34c2,0x19f4,0x19f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x19f8,0x19f8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x34ce,0x0000,0x0000,0x19fc,0x19fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x34da,0x0000,0x0000,0x1a00,0x1a00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x34e6,0x0000,0x0000,0x1a04,0x1a04,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x34f2,0x0000,0x0000,0x1a08,0x1a08,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1a0c,0x0000,0x0000,0x0000,0x1a10,0x0000,0x0000,0x0000,0x1a14,0x0000,0x0000,0x0000,0x1a18,0x0000,0x0000,0x0000,0x1a1c,0x0000,0x0000,0x0000,0x1a20,0x0000,0x0000,0x0000,0x1a24,0x3ebd,0x0000,0x0000,0x351a,0x3e8d,0x0000,0x1a28,0x1a2c,0x1a28,0x1a2c,0x1a28,0x1a2c,0x1a28,0x1a2c,0x0000,0x1a30,0x3c55,0x0000,0x0000,0x352a,0x0000,0x0000,0x1a34,0x1a38,0x1a34,0x1a38,0x1a34,0x1a38,0x1a34,0x1a38,0x0000,0x1a3c,0x0000,0x0000,0x0000,0x353a,0x0000,0x0000,0x1a40,0x1a44,0x1a40,0x1a44,0x1a40,0x1a44,0x1a40,0x1a44,0x0000,0x1a48,0x0000,0x0000,0x0000,0x354a,0x0000,0x0000,0x1a4c,0x1a50,0x1a4c,0x1a50,0x1a4c,0x1a50,0x1a4c,0x1a50,0x0000,0x1a54,0x3ede,0x0000,0x0000,0x1a58,0x3efa,0x0000,0x0000,0x1a5c,0x3f16,0x0000,0x0000,0x1a60,0x3f32,0x0000,0x0000,0x1a64,0x3f4a,0x0000,0x0000,0x356a,0x3f66,0x0000,0x1a68,0x0000,0x1a68,0x0000,0x1a68,0x0000,0x1a68,0x0000,0x0000,0x1a6c,0x3ed6,0x0000,0x0000,0x1a70,0x3ef2,0x0000,0x0000,0x1a74,0x3f0e,0x0000,0x0000,0x1a78,0x3f2a,0x0000,0x0000,0x1a7c,0x3f42,0x0000,0x0000,0x358a,0x3f5e,0x0000,0x1a80,0x0000,0x1a80,0x0000,0x1a80,0x0000,0x1a80,0x0000,0x0000,0x3596,0x3ea5,0x0000,0x0000,0x1a84,0x0000,0x1a84,0x0000,0x1a84,0x0000,0x1a84,0x0000,0x1a88,0x0000,0x0000,0x0000,0x1a8c,0x0000,0x0000,0x0000,0x1a90,0x0000,0x0000,0x0000,0x1a94,0x0000,0x0000,0x0000,0x35b2,0x0000,0x0000,0x1a98,0x1a9c,0x1a98,0x1a9c,0x1a98,0x1a9c,0x1a98,0x1a9c,0x0000,0x35be,0x0000,0x0000,0x0000,0x1aa0,0x0000,0x1aa0,0x0000,0x1aa0,0x0000,0x1aa0,0x0000,0x35ca,0x0000,0x0000,0x1aa4,0x1aa8,0x1aa4,0x1aa8,0x1aa4,0x1aa8,0x1aa4,0x1aa8,0x0000,0x1aac,0x0000,0x0000,0x0000,0x1ab0,0x0000,0x0000,0x0000,0x35de,0x1ab8,0x1abc,0x1ab4,0x0000,0x1ab4,0x0000,0x1ab4,0x0000,0x1ab4,0x0000,0x0000,0x35e9,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ac0,0x1ac0,0x0000,0x0000,0x1ac4,0x1ac4,0x0000,0x0000,0x1ac8,0x1ac8,0x0000,0x0000,0x0000,0x35fd,0x0000,0x0000,0x3fa6,0x3fa6,0x3fb6,0x3fb6,0x360e,0x360e,0x0000,0x0000,0x3616,0x3616,0x0000,0x0000,0x361e,0x361e,0x0000,0x0000,0x1acc,0x0000,0x1acc,0x0000,0x1acc,0x0000,0x1acc,0x0000,0x1ad0,0x1adc,0x1ad0,0x1adc,0x1ad0,0x1adc,0x1ad0,0x1adc,0x1ad4,0x0000,0x1ad4,0x0000,0x1ad4,0x0000,0x1ad4,0x0000,0x0000,0x3629,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x363a,0x363a,0x1b08,0x1b08,0x0000,0x0000,0x0000,0x0000,0x3642,0x3642,0x1b0c,0x1b0c,0x0000,0x1ad8,0x0000,0x1ad8,0x0000,0x1ad8,0x0000,0x1ad8,0x0000,0x1ae0,0x0000,0x1ae0,0x0000,0x1ae0,0x0000,0x1ae0,0x0000,0x1ae4,0x0000,0x0000,0x0000,0x3652,0x0000,0x0000,0x1ae8,0x0000,0x1ae8,0x0000,0x1ae8,0x0000,0x1ae8,0x0000,0x0000,0x365e,0x0000,0x0000,0x0000,0x1aec,0x0000,0x1aec,0x0000,0x1aec,0x0000,0x1aec,0x0000,0x1af0,0x0000,0x0000,0x0000,0x366e,0x0000,0x0000,0x1af4,0x1af8,0x1af4,0x1af8,0x1af4,0x1af8,0x1af4,0x1af8,0x0000,0x1afc,0x0000,0x0000,0x0000,0x367e,0x0000,0x0000,0x1b00,0x0000,0x1b00,0x0000,0x1b00,0x0000,0x1b00,0x0000,0x0000,0x368a,0x0000,0x0000,0x0000,0x1b04,0x0000,0x1b04,0x0000,0x1b04,0x0000,0x1b04,0x0000,0x1b10,0x0000,0x0000,0x0000,0x1b14,0x0000,0x0000,0x0000,0x369e,0x0000,0x0000,0x1b18,0x0000,0x1b18,0x0000,0x1b18,0x0000,0x1b18,0x0000,0x0000,0x36aa,0x0000,0x0000,0x0000,0x1b1c,0x0000,0x1b1c,0x0000,0x1b1c,0x0000,0x1b1c,0x0000,0x1b20,0x0000,0x0000,0x0000,0x1b24,0x0000,0x0000,0x0000,0x1b28,0x0000,0x0000,0x0000,0x1b2c,0x0000,0x0000,0x0000,0x1b30,0x0000,0x0000,0x0000,0x1b34,0x0000,0x0000,0x0000,0x36ce,0x0000,0x0000,0x1b38,0x0000,0x1b38,0x0000,0x1b38,0x0000,0x1b38,0x0000,0x0000,0x36da,0x0000,0x0000,0x0000,0x1b3c,0x0000,0x1b3c,0x0000,0x1b3c,0x0000,0x1b3c,0x0000,0x1b40,0x0000,0x0000,0x0000,0x1b44,0x0000,0x0000,0x0000,0x36ee,0x0000,0x0000,0x1b48,0x0000,0x1b48,0x0000,0x1b48,0x0000,0x1b48,0x0000,0x0000,0x36fa,0x0000,0x0000,0x0000,0x1b4c,0x0000,0x1b4c,0x0000,0x1b4c,0x0000,0x1b4c,0x0000,0x3706,0x0000,0x0000,0x1b50,0x1b54,0x1b50,0x1b54,0x1b50,0x1b54,0x1b50,0x1b54,0x3712,0x371a,0x0000,0x0000,0x1b58,0x0000,0x1b58,0x0000,0x1b58,0x0000,0x1b58,0x0000,0x0000,0x1b5c,0x0000,0x1b5c,0x0000,0x1b5c,0x0000,0x1b5c,0x3726,0x372e,0x3736,0x373e,0x1b60,0x0000,0x1b60,0x0000,0x1b60,0x0000,0x1b60,0x0000,0x0000,0x1b64,0x0000,0x1b64,0x0000,0x1b64,0x0000,0x1b64,0x1b68,0x0000,0x1b68,0x0000,0x1b68,0x0000,0x1b68,0x0000,0x0000,0x1b6c,0x0000,0x1b6c,0x0000,0x1b6c,0x0000,0x1b6c,0x374a,0x3752,0x375a,0x3762,0x1b70,0x0000,0x1b70,0x0000,0x1b70,0x0000,0x1b70,0x0000,0x0000,0x1b74,0x0000,0x1b74,0x0000,0x1b74,0x0000,0x1b74,0x1b78,0x0000,0x1b78,0x0000,0x1b78,0x0000,0x1b78,0x0000,0x0000,0x1b7c,0x0000,0x1b7c,0x0000,0x1b7c,0x0000,0x1b7c,0x376e,0x3776,0x0000,0x0000,0x1b80,0x0000,0x1b80,0x0000,0x1b80,0x0000,0x1b80,0x0000,0x0000,0x1b84,0x0000,0x1b84,0x0000,0x1b84,0x0000,0x1b84,0x3782,0x378a,0x0000,0x0000,0x1b88,0x0000,0x1b88,0x0000,0x1b88,0x0000,0x1b88,0x0000,0x0000,0x1b8c,0x0000,0x1b8c,0x0000,0x1b8c,0x0000,0x1b8c,0x3796,0x379e,0x0000,0x0000,0x1b90,0x0000,0x1b90,0x0000,0x1b90,0x0000,0x1b90,0x0000,0x0000,0x1b94,0x0000,0x1b94,0x0000,0x1b94,0x0000,0x1b94,0x0000,0x37aa,0x0000,0x0000,0x1b98,0x1b9c,0x1b98,0x1b9c,0x1b98,0x1b9c,0x1b98,0x1b9c,0x0000,0x37b6,0x0000,0x0000,0x1ba0,0x1ba4,0x1ba0,0x1ba4,0x1ba0,0x1ba4,0x1ba0,0x1ba4,0x0000,0x37c2,0x0000,0x0000,0x1ba8,0x0000,0x1ba8,0x0000,0x1ba8,0x0000,0x1ba8,0x0000,0x0000,0x37ce,0x0000,0x0000,0x0000,0x0000,0x1bac,0x1bb0,0x1bac,0x1bb0,0x0000,0x0000,0x0000,0x37d9,0x0000,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x37ea,0x0000,0x0000,0x0000,0x1bb4,0x1bb8,0x1bb4,0x1bb8,0x0000,0x0000,0x0000,0x37f5,0x0000,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x3806,0x0000,0x0000,0x0000,0x0000,0x0000,0x1bbc,0x1bc0,0x0000,0x0000,0x0000,0x3811,0x0000,0x0000,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x3822,0x382a,0x1bc4,0x1bcc,0x1bc4,0x1bcc,0x1bc4,0x1bcc,0x1bc4,0x1bcc,0x1bc8,0x1bd0,0x1bc8,0x1bd0,0x1bc8,0x1bd0,0x1bc8,0x1bd0,0x0000,0x403e,0x383e,0x3836,0x1bd4,0x0000,0x1bd4,0x0000,0x1bd4,0x0000,0x1bd4,0x0000,0x1bd8,0x0000,0x1bd8,0x0000,0x1bd8,0x0000,0x1bd8,0x0000,0x0000,0x384a,0x1c10,0x1c0c,0x1bdc,0x1be0,0x1bdc,0x1be0,0x1bdc,0x1be0,0x1bdc,0x1be0,0x3856,0x385e,0x1c08,0x1c04,0x1be4,0x1be8,0x1be4,0x1be8,0x1be4,0x1be8,0x1be4,0x1be8,0x1bec,0x1bf0,0x1bec,0x1bf0,0x1bec,0x1bf0,0x1bec,0x1bf0,0x0000,0x386a,0x3f3a,0x0000,0x1bf4,0x0000,0x1bf4,0x0000,0x1bf4,0x0000,0x1bf4,0x0000,0x0000,0x3876,0x0000,0x0000,0x1bf8,0x0000,0x1bf8,0x0000,0x1bf8,0x0000,0x1bf8,0x0000,0x0000,0x3882,0x389e,0x38a6,0x1c14,0x1c18,0x1c14,0x1c18,0x1c14,0x1c18,0x1c14,0x1c18,0x388e,0x3896,0x1c30,0x1c2c,0x1c1c,0x1c20,0x1c1c,0x1c20,0x1c1c,0x1c20,0x1c1c,0x1c20,0x1c24,0x1c28,0x1c24,0x1c28,0x1c24,0x1c28,0x1c24,0x1c28,0x1c34,0x1c3c,0x1c34,0x1c3c,0x1c34,0x1c3c,0x1c34,0x1c3c,0x1c38,0x1c40,0x1c38,0x1c40,0x1c38,0x1c40,0x1c38,0x1c40,0x0000,0x38b2,0x0000,0x0000,0x1c44,0x0000,0x1c44,0x0000,0x1c44,0x0000,0x1c44,0x0000,0x0000,0x3d0a,0x38be,0x0000,0x1c48,0x0000,0x1c48,0x0000,0x1c48,0x0000,0x1c48,0x0000,0x0000,0x38c9,0x0000,0x0000,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x38da,0x38e2,0x1c4c,0x1c54,0x1c4c,0x1c54,0x1c4c,0x1c54,0x1c4c,0x1c54,0x1c50,0x1c58,0x1c50,0x1c58,0x1c50,0x1c58,0x1c50,0x1c58,0x0000,0x38ee,0x0000,0x0000,0x0000,0x0000,0x1c5c,0x1c60,0x1c5c,0x1c60,0x0000,0x0000,0x0000,0x38fa,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c64,0x1c68,0x0000,0x0000,0x0000,0x3906,0x0000,0x0000,0x0000,0x0000,0x1c6c,0x1c70,0x1c6c,0x1c70,0x0000,0x0000,0x0000,0x3912,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1c74,0x1c78,0x0000,0x0000,0x0000,0x391e,0x0000,0x0000,0x1c7c,0x1c80,0x1c7c,0x1c80,0x1c7c,0x1c80,0x1c7c,0x1c80,0x0000,0x392a,0x0000,0x0000,0x1c84,0x1c88,0x1c84,0x1c88,0x1c84,0x1c88,0x1c84,0x1c88,0x0000,0x3936,0x0000,0x0000,0x1c8c,0x1c90,0x1c8c,0x1c90,0x1c8c,0x1c90,0x1c8c,0x1c90,0x0000,0x3942,0x0000,0x0000,0x1c94,0x1c98,0x1c94,0x1c98,0x1c94,0x1c98,0x1c94,0x1c98,0x0000,0x394e,0x0000,0x0000,0x1c9c,0x1ca0,0x1c9c,0x1ca0,0x1c9c,0x1ca0,0x1c9c,0x1ca0,0x0000,0x395a,0x0000,0x0000,0x1ca4,0x1ca8,0x1ca4,0x1ca8,0x1ca4,0x1ca8,0x1ca4,0x1ca8,0x0000,0x3966,0x0000,0x0000,0x1cac,0x1cb0,0x1cac,0x1cb0,0x1cac,0x1cb0,0x1cac,0x1cb0,0x0000,0x3972,0x0000,0x0000,0x1cb4,0x1cb8,0x1cb4,0x1cb8,0x1cb4,0x1cb8,0x1cb4,0x1cb8,0x0000,0x397e,0x0000,0x0000,0x1cbc,0x1cc0,0x1cbc,0x1cc0,0x1cbc,0x1cc0,0x1cbc,0x1cc0,0x0000,0x398a,0x0000,0x0000,0x1cc4,0x1cc8,0x1cc4,0x1cc8,0x1cc4,0x1cc8,0x1cc4,0x1cc8,0x0000,0x3996,0x0000,0x0000,0x1ccc,0x1cd0,0x1ccc,0x1cd0,0x1ccc,0x1cd0,0x1ccc,0x1cd0,0x0000,0x39a2,0x0000,0x0000,0x1cd4,0x1cd8,0x1cd4,0x1cd8,0x1cd4,0x1cd8,0x1cd4,0x1cd8,0x0000,0x39ae,0x0000,0x0000,0x1cdc,0x1ce0,0x1cdc,0x1ce0,0x1cdc,0x1ce0,0x1cdc,0x1ce0,0x0000,0x39ba,0x0000,0x0000,0x1ce4,0x1ce8,0x1ce4,0x1ce8,0x1ce4,0x1ce8,0x1ce4,0x1ce8,0x0000,0x39c6,0x0000,0x0000,0x1cec,0x1cf0,0x1cec,0x1cf0,0x1cec,0x1cf0,0x1cec,0x1cf0,0x0000,0x39d2,0x0000,0x0000,0x1cf4,0x1cf8,0x1cf4,0x1cf8,0x1cf4,0x1cf8,0x1cf4,0x1cf8,0x0000,0x39de,0x0000,0x0000,0x1cfc,0x1d00,0x1cfc,0x1d00,0x1cfc,0x1d00,0x1cfc,0x1d00,0x0000,0x39ea,0x0000,0x0000,0x1d04,0x1d08,0x1d04,0x1d08,0x1d04,0x1d08,0x1d04,0x1d08,0x0000,0x39f6,0x0000,0x0000,0x1d0c,0x1d10,0x1d0c,0x1d10,0x1d0c,0x1d10,0x1d0c,0x1d10,0x0000,0x3a02,0x0000,0x0000,0x1d14,0x1d18,0x1d14,0x1d18,0x1d14,0x1d18,0x1d14,0x1d18,0x0000,0x3a0e,0x0000,0x0000,0x1d1c,0x1d20,0x1d1c,0x1d20,0x1d1c,0x1d20,0x1d1c,0x1d20,0x0000,0x3a1a,0x0000,0x0000,0x1d24,0x1d28,0x1d24,0x1d28,0x1d24,0x1d28,0x1d24,0x1d28,0x0000,0x3a26,0x0000,0x0000,0x1d2c,0x1d30,0x1d2c,0x1d30,0x1d2c,0x1d30,0x1d2c,0x1d30,0x0000,0x3a32,0x0000,0x0000,0x1d34,0x1d38,0x1d34,0x1d38,0x1d34,0x1d38,0x1d34,0x1d38,0x0000,0x3a3e,0x0000,0x0000,0x1d3c,0x1d40,0x1d3c,0x1d40,0x1d3c,0x1d40,0x1d3c,0x1d40,0x0000,0x3a4a,0x0000,0x0000,0x1d44,0x1d48,0x1d44,0x1d48,0x1d44,0x1d48,0x1d44,0x1d48,0x0000,0x3a56,0x0000,0x0000,0x1d4c,0x1d50,0x1d4c,0x1d50,0x1d4c,0x1d50,0x1d4c,0x1d50,0x0000,0x3a62,0x0000,0x0000,0x1d54,0x1d58,0x1d54,0x1d58,0x1d54,0x1d58,0x1d54,0x1d58,0x0000,0x3a6e,0x0000,0x0000,0x1d5c,0x1d60,0x1d5c,0x1d60,0x1d5c,0x1d60,0x1d5c,0x1d60,0x0000,0x3a7a,0x0000,0x0000,0x1d64,0x1d68,0x1d64,0x1d68,0x1d64,0x1d68,0x1d64,0x1d68,0x0000,0x3a86,0x0000,0x0000,0x1d6c,0x1d70,0x1d6c,0x1d70,0x1d6c,0x1d70,0x1d6c,0x1d70,0x0000,0x3a92,0x0000,0x0000,0x1d74,0x1d78,0x1d74,0x1d78,0x1d74,0x1d78,0x1d74,0x1d78,0x459a,0x3a9e,0x0000,0x0000,0x1d7c,0x1d80,0x1d7c,0x1d80,0x1d7c,0x1d80,0x1d7c,0x1d80,0x45a2,0x3aaa,0x0000,0x0000,0x1d84,0x1d88,0x1d84,0x1d88,0x1d84,0x1d88,0x1d84,0x1d88,0x0000,0x3ab5,0x0000,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x3ac6,0x0000,0x1d8c,0x1d90,0x1d8c,0x1d90,0x1d8c,0x1d90,0x1d8c,0x1d90,0x0000,0x3ad1,0x0000,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x3ae2,0x0000,0x1d94,0x1d98,0x1d94,0x1d98,0x1d94,0x1d98,0x1d94,0x1d98,0x0000,0x3aee,0x0000,0x0000,0x1d9c,0x1da0,0x1d9c,0x1da0,0x1d9c,0x1da0,0x1d9c,0x1da0,0x0000,0x3afa,0x0000,0x0000,0x1da4,0x1da8,0x1da4,0x1da8,0x1da4,0x1da8,0x1da4,0x1da8,0x457a,0x3b06,0x0000,0x0000,0x1dac,0x1db0,0x1dac,0x1db0,0x1dac,0x1db0,0x1dac,0x1db0,0x4582,0x3b12,0x0000,0x0000,0x1db4,0x1db8,0x1db4,0x1db8,0x1db4,0x1db8,0x1db4,0x1db8,0x0000,0x3b1e,0x0000,0x0000,0x0000,0x0000,0x1dbc,0x1dc0,0x1dbc,0x1dc0,0x0000,0x0000,0x0000,0x3b2a,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dc4,0x1dc8,0x0000,0x0000,0x0000,0x3b36,0x0000,0x0000,0x0000,0x0000,0x1dcc,0x1dd0,0x1dcc,0x1dd0,0x0000,0x0000,0x0000,0x3b42,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1dd4,0x1dd8,0x0000,0x0000,0x0000,0x0000,0x0000,0x3b4e,0x1ddc,0x1de0,0x1ddc,0x1de0,0x1ddc,0x1de0,0x1ddc,0x1de0,0x0000,0x3b5a,0x0000,0x0000,0x1de4,0x1de8,0x1de4,0x1de8,0x1de4,0x1de8,0x1de4,0x1de8,0x0000,0x3b66,0x0000,0x0000,0x1dec,0x1df0,0x1dec,0x1df0,0x1dec,0x1df0,0x1dec,0x1df0,0x0000,0x3b71,0x0000,0x0000,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x0000,0x3b82,0x1df4,0x0000,0x1df4,0x0000,0x1df4,0x0000,0x1df4,0x0000,0x0000,0x3b8d,0x0000,0x0000,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x0000,0x3b9e,0x1df8,0x0000,0x1df8,0x0000,0x1df8,0x0000,0x1df8,0x0000,0x0000,0x3ba9,0x0000,0x0000,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x1dfc,0x0000,0x3bbd,0x0000,0x0000,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x0000,0x3bce,0x1dfc,0x1e00,0x1dfc,0x1e00,0x1dfc,0x1e00,0x1dfc,0x1e00,0x0000,0x3bda,0x0000,0x0000,0x1e04,0x0000,0x1e04,0x0000,0x1e04,0x0000,0x1e04,0x0000,0x0000,0x3be6,0x0000,0x0000,0x1e08,0x0000,0x1e08,0x0000,0x1e08,0x0000,0x1e08,0x0000,0x0000,0x3bf2,0x0000,0x0000,0x1e0c,0x0000,0x1e0c,0x0000,0x1e0c,0x0000,0x1e0c,0x0000,0x0000,0x3bfe,0x0000,0x0000,0x1e14,0x1e10,0x1e14,0x1e10,0x1e14,0x1e10,0x1e14,0x1e10,0x0000,0x3c09,0x0000,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x3c1a,0x0000,0x0000,0x0000,0x1e18,0x1e1c,0x1e18,0x1e1c,0x0000,0x0000,0x0000,0x3c25,0x0000,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x3c36,0x0000,0x0000,0x0000,0x0000,0x0000,0x1e20,0x1e24,0x0000,0x0000,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x3c4e,0x0000,0x1e28,0x0000,0x1e28,0x0000,0x1e28,0x0000,0x1e28,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x0000,0x3c66,0x1e2c,0x0000,0x1e2c,0x0000,0x1e2c,0x0000,0x1e2c,0x0000,0x0000,0x3c72,0x0000,0x0000,0x1e30,0x1e38,0x1e30,0x1e38,0x1e30,0x1e38,0x1e30,0x1e38,0x0000,0x3c7e,0x0000,0x0000,0x1e34,0x1e3c,0x1e34,0x1e3c,0x1e34,0x1e3c,0x1e34,0x1e3c,0x0000,0x3c8a,0x0000,0x0000,0x1e40,0x1e48,0x1e40,0x1e48,0x1e40,0x1e48,0x1e40,0x1e48,0x0000,0x3c96,0x0000,0x0000,0x1e44,0x1e4c,0x1e44,0x1e4c,0x1e44,0x1e4c,0x1e44,0x1e4c,0x0000,0x3ca1,0x0000,0x0000,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x3cb2,0x3cba,0x1e50,0x1e58,0x1e50,0x1e58,0x1e50,0x1e58,0x1e50,0x1e58,0x1e54,0x1e5c,0x1e54,0x1e5c,0x1e54,0x1e5c,0x1e54,0x1e5c,0x0000,0x3cc5,0x0000,0x0000,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x3cd6,0x3cde,0x1e60,0x1e68,0x1e60,0x1e68,0x1e60,0x1e68,0x1e60,0x1e68,0x1e64,0x1e6c,0x1e64,0x1e6c,0x1e64,0x1e6c,0x1e64,0x1e6c,0x0000,0x3cea,0x0000,0x0000,0x1e70,0x1e74,0x1e70,0x1e74,0x1e70,0x1e74,0x1e70,0x1e74,0x0000,0x3cf6,0x0000,0x0000,0x1e78,0x0000,0x1e78,0x0000,0x1e78,0x0000,0x1e78,0x0000,0x0000,0x3d02,0x0000,0x0000,0x1e7c,0x0000,0x1e7c,0x0000,0x1e7c,0x0000,0x1e7c,0x0000,0x1e80,0x0000,0x1e80,0x0000,0x1e80,0x0000,0x1e80,0x0000,0x0000,0x3d16,0x0000,0x0000,0x1e84,0x0000,0x1e84,0x0000,0x1e84,0x0000,0x1e84,0x0000,0x0000,0x3d22,0x0000,0x0000,0x1e88,0x1e8c,0x1e88,0x1e8c,0x1e88,0x1e8c,0x1e88,0x1e8c,0x0000,0x3d2e,0x0000,0x0000,0x0000,0x0000,0x1e90,0x1ec4,0x1e90,0x1ec4,0x0000,0x0000,0x0000,0x3d3a,0x0000,0x0000,0x1e94,0x1e98,0x1e94,0x1e98,0x1e94,0x1e98,0x1e94,0x1e98,0x0000,0x3d46,0x0000,0x0000,0x1e9c,0x1ea0,0x1e9c,0x1ea0,0x1e9c,0x1ea0,0x1e9c,0x1ea0,0x0000,0x3d52,0x0000,0x0000,0x1ea4,0x1ea8,0x1ea4,0x1ea8,0x1ea4,0x1ea8,0x1ea4,0x1ea8,0x0000,0x3d5e,0x0000,0x0000,0x1eac,0x0000,0x1eac,0x0000,0x1eac,0x0000,0x1eac,0x0000,0x0000,0x3d6a,0x0000,0x0000,0x0000,0x1eb0,0x0000,0x1eb0,0x0000,0x1eb0,0x0000,0x1eb0,0x0000,0x3d76,0x0000,0x0000,0x1eb4,0x0000,0x1eb4,0x0000,0x1eb4,0x0000,0x1eb4,0x0000,0x0000,0x3d82,0x0000,0x0000,0x0000,0x1eb8,0x0000,0x1eb8,0x0000,0x1eb8,0x0000,0x1eb8,0x0000,0x3d8e,0x0000,0x0000,0x0000,0x0000,0x1ebc,0x1ec0,0x1ebc,0x1ec0,0x0000,0x0000,0x0000,0x3d9a,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ec8,0x0000,0x1ec8,0x0000,0x0000,0x0000,0x3da6,0x0000,0x0000,0x0000,0x0000,0x0000,0x1ecc,0x0000,0x1ecc,0x0000,0x0000,0x0000,0x3db2,0x0000,0x0000,0x1ed0,0x1ed4,0x1ed0,0x1ed4,0x1ed0,0x1ed4,0x1ed0,0x1ed4,0x0000,0x3dbe,0x0000,0x0000,0x1ed8,0x1edc,0x1ed8,0x1edc,0x1ed8,0x1edc,0x1ed8,0x1edc,0x0000,0x3dca,0x0000,0x0000,0x1ee0,0x1ee4,0x1ee0,0x1ee4,0x1ee0,0x1ee4,0x1ee0,0x1ee4,0x0000,0x3dd5,0x0000,0x0000,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x3de6,0x3dee,0x1ee8,0x1ef0,0x1ee8,0x1ef0,0x1ee8,0x1ef0,0x1ee8,0x1ef0,0x1eec,0x1ef4,0x1eec,0x1ef4,0x1eec,0x1ef4,0x1eec,0x1ef4,0x0000,0x3df9,0x0000,0x0000,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x3e0a,0x3e12,0x1ef8,0x1f00,0x1ef8,0x1f00,0x1ef8,0x1f00,0x1ef8,0x1f00,0x1efc,0x1f04,0x1efc,0x1f04,0x1efc,0x1f04,0x1efc,0x1f04,0x0000,0x3e1d,0x0000,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x3e2e,0x0000,0x1f08,0x1f0c,0x1f08,0x1f0c,0x1f08,0x1f0c,0x1f08,0x1f0c,0x0000,0x3e39,0x0000,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x3e4a,0x0000,0x1f10,0x1f14,0x1f10,0x1f14,0x1f10,0x1f14,0x1f10,0x1f14,0x0000,0x3e56,0x0000,0x0000,0x1f18,0x1f1c,0x1f18,0x1f1c,0x1f18,0x1f1c,0x1f18,0x1f1c,0x0000,0x3e62,0x0000,0x0000,0x0000,0x1f20,0x0000,0x1f20,0x0000,0x1f20,0x0000,0x1f20,0x0000,0x3e6e,0x0000,0x0000,0x0000,0x1f24,0x0000,0x1f24,0x0000,0x1f24,0x0000,0x1f24,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x0000,0x3e86,0x1f28,0x1f2c,0x1f28,0x1f2c,0x1f28,0x1f2c,0x1f28,0x1f2c,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x0000,0x3e9e,0x1f30,0x1f34,0x1f30,0x1f34,0x1f30,0x1f34,0x1f30,0x1f34,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x0000,0x3eb6,0x1f38,0x1f3c,0x1f38,0x1f3c,0x1f38,0x1f3c,0x1f38,0x1f3c,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x0000,0x3ece,0x1f40,0x1f44,0x1f40,0x1f44,0x1f40,0x1f44,0x1f40,0x1f44,0x1f48,0x0000,0x1f48,0x0000,0x1f48,0x0000,0x1f48,0x0000,0x1f4c,0x0000,0x1f4c,0x0000,0x1f4c,0x0000,0x1f4c,0x0000,0x0000,0x4086,0x3eea,0x0000,0x1f50,0x0000,0x1f50,0x0000,0x1f50,0x0000,0x1f50,0x0000,0x1f54,0x0000,0x1f54,0x0000,0x1f54,0x0000,0x1f54,0x0000,0x1f58,0x0000,0x1f58,0x0000,0x1f58,0x0000,0x1f58,0x0000,0x0000,0x4072,0x3f06,0x0000,0x1f5c,0x0000,0x1f5c,0x0000,0x1f5c,0x0000,0x1f5c,0x0000,0x1f60,0x0000,0x1f60,0x0000,0x1f60,0x0000,0x1f60,0x0000,0x1f64,0x0000,0x1f64,0x0000,0x1f64,0x0000,0x1f64,0x0000,0x0000,0x405e,0x3f22,0x0000,0x1f68,0x0000,0x1f68,0x0000,0x1f68,0x0000,0x1f68,0x0000,0x1f6c,0x0000,0x1f6c,0x0000,0x1f6c,0x0000,0x1f6c,0x0000,0x1f70,0x0000,0x1f70,0x0000,0x1f70,0x0000,0x1f70,0x0000,0x1f74,0x0000,0x1f74,0x0000,0x1f74,0x0000,0x1f74,0x0000,0x1f78,0x0000,0x1f78,0x0000,0x1f78,0x0000,0x1f78,0x0000,0x1f7c,0x0000,0x1f7c,0x0000,0x1f7c,0x0000,0x1f7c,0x0000,0x0000,0x3f9e,0x3f56,0x0000,0x1f80,0x0000,0x1f80,0x0000,0x1f80,0x0000,0x1f80,0x0000,0x1f84,0x0000,0x1f84,0x0000,0x1f84,0x0000,0x1f84,0x0000,0x1f88,0x0000,0x1f88,0x0000,0x1f88,0x0000,0x1f88,0x0000,0x0000,0x3fae,0x3f72,0x0000,0x1f8c,0x0000,0x1f8c,0x0000,0x1f8c,0x0000,0x1f8c,0x0000,0x0000,0x3f7e,0x0000,0x0000,0x0000,0x1f90,0x0000,0x1f90,0x0000,0x1f90,0x0000,0x1f90,0x0000,0x3f8a,0x0000,0x0000,0x1f94,0x1f98,0x1f94,0x1f98,0x1f94,0x1f98,0x1f94,0x1f98,0x0000,0x3f96,0x0000,0x0000,0x1f9c,0x1fa0,0x1f9c,0x1fa0,0x1f9c,0x1fa0,0x1f9c,0x1fa0,0x1fa4,0x1fa8,0x1fa4,0x1fa8,0x1fa4,0x1fa8,0x1fa4,0x1fa8,0x1fac,0x1fb0,0x1fac,0x1fb0,0x1fac,0x1fb0,0x1fac,0x1fb0,0x1fb4,0x1fb8,0x1fb4,0x1fb8,0x1fb4,0x1fb8,0x1fb4,0x1fb8,0x1fbc,0x1fc0,0x1fbc,0x1fc0,0x1fbc,0x1fc0,0x1fbc,0x1fc0,0x0000,0x3fc1,0x0000,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x3fd2,0x0000,0x1fc4,0x1fc8,0x1fc4,0x1fc8,0x1fc4,0x1fc8,0x1fc4,0x1fc8,0x0000,0x3fdd,0x0000,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x3fee,0x0000,0x1fcc,0x1fd0,0x1fcc,0x1fd0,0x1fcc,0x1fd0,0x1fcc,0x1fd0,0x0000,0x3ffa,0x0000,0x0000,0x0000,0x1fd4,0x0000,0x1fd4,0x0000,0x1fd4,0x0000,0x1fd4,0x0000,0x4006,0x0000,0x0000,0x1fd8,0x1fdc,0x1fd8,0x1fdc,0x1fd8,0x1fdc,0x1fd8,0x1fdc,0x0000,0x4012,0x0000,0x0000,0x0000,0x1fe0,0x0000,0x1fe0,0x0000,0x1fe0,0x0000,0x1fe0,0x0000,0x401e,0x0000,0x0000,0x1fe4,0x1fe8,0x1fe4,0x1fe8,0x1fe4,0x1fe8,0x1fe4,0x1fe8,0x0000,0x402a,0x0000,0x0000,0x0000,0x1fec,0x0000,0x1fec,0x0000,0x1fec,0x0000,0x1fec,0x0000,0x4036,0x0000,0x0000,0x1ff0,0x1ff4,0x1ff0,0x1ff4,0x1ff0,0x1ff4,0x1ff0,0x1ff4,0x0000,0x1ff8,0x0000,0x1ff8,0x0000,0x1ff8,0x0000,0x1ff8,0x0000,0x404a,0x0000,0x0000,0x1ffc,0x2000,0x1ffc,0x2000,0x1ffc,0x2000,0x1ffc,0x2000,0x0000,0x4056,0x0000,0x0000,0x2004,0x0000,0x2004,0x0000,0x2004,0x0000,0x2004,0x0000,0x0000,0x2008,0x0000,0x2008,0x0000,0x2008,0x0000,0x2008,0x0000,0x406a,0x0000,0x0000,0x200c,0x2010,0x200c,0x2010,0x200c,0x2010,0x200c,0x2010,0x0000,0x2014,0x0000,0x2014,0x0000,0x2014,0x0000,0x2014,0x0000,0x407e,0x0000,0x0000,0x2018,0x201c,0x2018,0x201c,0x2018,0x201c,0x2018,0x201c,0x0000,0x2020,0x0000,0x2020,0x0000,0x2020,0x0000,0x2020,0x0000,0x4092,0x0000,0x0000,0x2024,0x2028,0x2024,0x2028,0x2024,0x2028,0x2024,0x2028,0x0000,0x409e,0x0000,0x0000,0x202c,0x2030,0x202c,0x2030,0x202c,0x2030,0x202c,0x2030,0x0000,0x40aa,0x40be,0x0000,0x2034,0x2038,0x2034,0x2038,0x2034,0x2038,0x2034,0x2038,0x0000,0x40b6,0x40c6,0x0000,0x203c,0x2040,0x203c,0x2040,0x203c,0x2040,0x203c,0x2040,0x2044,0x2048,0x2044,0x2048,0x2044,0x2048,0x2044,0x2048,0x204c,0x2050,0x204c,0x2050,0x204c,0x2050,0x204c,0x2050,0x0000,0x40d2,0x0000,0x0000,0x2054,0x2058,0x2054,0x2058,0x2054,0x2058,0x2054,0x2058,0x0000,0x40de,0x0000,0x0000,0x205c,0x2060,0x205c,0x2060,0x205c,0x2060,0x205c,0x2060,0x0000,0x40ea,0x0000,0x0000,0x2064,0x2068,0x2064,0x2068,0x2064,0x2068,0x2064,0x2068,0x0000,0x40f6,0x0000,0x0000,0x206c,0x2070,0x206c,0x2070,0x206c,0x2070,0x206c,0x2070,0x458a,0x4102,0x0000,0x0000,0x2074,0x2078,0x2074,0x2078,0x2074,0x2078,0x2074,0x2078,0x4592,0x410e,0x0000,0x0000,0x207c,0x2080,0x207c,0x2080,0x207c,0x2080,0x207c,0x2080,0x456a,0x411a,0x0000,0x0000,0x2084,0x0000,0x2084,0x0000,0x2084,0x0000,0x2084,0x0000,0x0000,0x4126,0x0000,0x0000,0x0000,0x2088,0x0000,0x2088,0x0000,0x2088,0x0000,0x2088,0x4572,0x4132,0x0000,0x0000,0x208c,0x0000,0x208c,0x0000,0x208c,0x0000,0x208c,0x0000,0x0000,0x413e,0x0000,0x0000,0x0000,0x2090,0x0000,0x2090,0x0000,0x2090,0x0000,0x2090,0x0000,0x414a,0x0000,0x0000,0x2094,0x2098,0x2094,0x2098,0x2094,0x2098,0x2094,0x2098,0x0000,0x4156,0x0000,0x0000,0x209c,0x20a0,0x209c,0x20a0,0x209c,0x20a0,0x209c,0x20a0,0x0000,0x4162,0x0000,0x0000,0x20a4,0x20a8,0x20a4,0x20a8,0x20a4,0x20a8,0x20a4,0x20a8,0x0000,0x416e,0x0000,0x0000,0x20ac,0x20b0,0x20ac,0x20b0,0x20ac,0x20b0,0x20ac,0x20b0,0x0000,0x4179,0x0000,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x418a,0x0000,0x20b4,0x20b8,0x20b4,0x20b8,0x20b4,0x20b8,0x20b4,0x20b8,0x0000,0x4195,0x0000,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x41a6,0x0000,0x20bc,0x20c0,0x20bc,0x20c0,0x20bc,0x20c0,0x20bc,0x20c0,0x0000,0x41b2,0x0000,0x0000,0x0000,0x0000,0x20c4,0x20c8,0x20c4,0x20c8,0x0000,0x0000,0x0000,0x41be,0x0000,0x0000,0x0000,0x0000,0x20cc,0x20d0,0x20cc,0x20d0,0x0000,0x0000,0x41ca,0x41d2,0x0000,0x0000,0x20d4,0x0000,0x20d4,0x0000,0x20d4,0x0000,0x20d4,0x0000,0x0000,0x20d8,0x0000,0x20d8,0x0000,0x20d8,0x0000,0x20d8,0x41f5,0x41dd,0x0000,0x0000,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x41ee,0x0000,0x0000,0x20dc,0x20e4,0x0000,0x0000,0x0000,0x0000,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x4206,0x0000,0x0000,0x20e0,0x20e8,0x0000,0x0000,0x0000,0x0000,0x4229,0x4211,0x0000,0x0000,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x4222,0x0000,0x0000,0x20ec,0x20f4,0x0000,0x0000,0x0000,0x0000,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x423a,0x0000,0x0000,0x20f0,0x20f8,0x0000,0x0000,0x0000,0x0000,0x425d,0x4245,0x0000,0x0000,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x0000,0x4256,0x20fc,0x2104,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x0000,0x426e,0x2100,0x2108,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4291,0x4279,0x0000,0x0000,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x428a,0x0000,0x0000,0x210c,0x2114,0x0000,0x0000,0x0000,0x0000,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x42a2,0x0000,0x0000,0x2110,0x2118,0x0000,0x0000,0x0000,0x0000,0x42c5,0x42ad,0x0000,0x0000,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x42be,0x0000,0x0000,0x211c,0x2124,0x0000,0x0000,0x0000,0x0000,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x42d6,0x0000,0x0000,0x2120,0x2128,0x0000,0x0000,0x0000,0x0000,0x42f9,0x42e1,0x0000,0x0000,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x42f2,0x0000,0x0000,0x212c,0x2134,0x0000,0x0000,0x0000,0x0000,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x430a,0x0000,0x0000,0x2130,0x2138,0x0000,0x0000,0x0000,0x0000,0x432d,0x4315,0x0000,0x0000,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x4326,0x0000,0x0000,0x213c,0x2144,0x0000,0x0000,0x0000,0x0000,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x433e,0x0000,0x0000,0x2140,0x2148,0x0000,0x0000,0x0000,0x0000,0x4361,0x4349,0x0000,0x0000,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x435a,0x0000,0x0000,0x214c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x4372,0x0000,0x0000,0x2150,0x2154,0x0000,0x0000,0x0000,0x0000,0x4395,0x437d,0x0000,0x0000,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x0000,0x438e,0x2158,0x2160,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x0000,0x43a6,0x215c,0x2164,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43ba,0x43b2,0x0000,0x0000,0x2168,0x2170,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x216c,0x2174,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43dd,0x43c5,0x0000,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x43d6,0x0000,0x2178,0x2180,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x43ee,0x0000,0x217c,0x2184,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4415,0x43f9,0x0000,0x442d,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x0000,0x440a,0x2188,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4415,0x43f9,0x0000,0x4445,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x0000,0x4426,0x218c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x0000,0x443e,0x2190,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x0000,0x4456,0x2190,0x2194,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x447d,0x4461,0x0000,0x4495,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x0000,0x4472,0x2198,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x447d,0x4461,0x0000,0x44ad,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x0000,0x448e,0x219c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x0000,0x44a6,0x21a0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x0000,0x44be,0x21a0,0x21a4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44e1,0x44c9,0x0000,0x0000,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x0000,0x44da,0x21a8,0x21b0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x0000,0x44f2,0x21ac,0x21b4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x44fd,0x0000,0x0000,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x0000,0x450e,0x21b8,0x21bc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4519,0x0000,0x0000,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x0000,0x452a,0x21c0,0x21c4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4535,0x0000,0x0000,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x0000,0x4546,0x21c8,0x21cc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4551,0x0000,0x0000,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x0000,0x4562,0x21d0,0x21d4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x21d8,0x0000,0x21d8,0x0000,0x21d8,0x0000,0x21d8,0x0000,0x21dc,0x0000,0x21dc,0x0000,0x21dc,0x0000,0x21dc,0x0000,0x21e0,0x0000,0x21e0,0x0000,0x21e0,0x0000,0x21e0,0x0000,0x21e4,0x0000,0x21e4,0x0000,0x21e4,0x0000,0x21e4,0x0000,0x21e8,0x0000,0x21e8,0x0000,0x21e8,0x0000,0x21e8,0x0000,0x21ec,0x0000,0x21ec,0x0000,0x21ec,0x0000,0x21ec,0x0000,0x21f0,0x0000,0x21f0,0x0000,0x21f0,0x0000,0x21f0,0x0000,0x21f4,0x0000,0x21f4,0x0000,0x21f4,0x0000,0x21f4,0x0000,0x45ae,0x0000,0x45b6,0x0000,0x21f8,0x0000,0x21f8,0x0000,0x21f8,0x0000,0x21f8,0x0000,0x21fc,0x0000,0x21fc,0x0000,0x21fc,0x0000,0x21fc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x46bf,0x46e3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4707,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x471b,0x0000,0x471f,0x4723,0x4727,0x4733,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x473f,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4753,0x4767,0x477b,0x479f,0x47bb,0x47cf,0x47e3,0x47f7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x480b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4817,0x482b,0x483f,0x4853,0x485f,0x4873,0x4897,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x46c1,0x0000,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x46d2,0x46da,0x2200,0x0000,0x2200,0x0000,0x2200,0x0000,0x2200,0x0000,0x2204,0x0000,0x2204,0x0000,0x2204,0x0000,0x2204,0x0000,0x0000,0x0000,0x46e5,0x0000,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x46f6,0x46fe,0x2208,0x0000,0x2208,0x0000,0x2208,0x0000,0x2208,0x0000,0x220c,0x0000,0x220c,0x0000,0x220c,0x0000,0x220c,0x0000,0x470a,0x4712,0x0000,0x0000,0x2210,0x0000,0x2210,0x0000,0x2210,0x0000,0x2210,0x0000,0x2214,0x0000,0x2214,0x0000,0x2214,0x0000,0x2214,0x0000,0x0000,0x0000,0x2218,0x0000,0x0000,0x0000,0x221c,0x0000,0x0000,0x0000,0x2220,0x0000,0x472a,0x0000,0x0000,0x0000,0x2224,0x0000,0x2224,0x0000,0x2224,0x0000,0x2224,0x0000,0x4736,0x0000,0x0000,0x0000,0x2228,0x0000,0x2228,0x0000,0x2228,0x0000,0x2228,0x0000,0x4742,0x0000,0x474a,0x0000,0x222c,0x0000,0x222c,0x0000,0x222c,0x0000,0x222c,0x0000,0x2230,0x0000,0x2230,0x0000,0x2230,0x0000,0x2230,0x0000,0x4756,0x0000,0x475e,0x0000,0x2234,0x0000,0x2234,0x0000,0x2234,0x0000,0x2234,0x0000,0x2238,0x0000,0x2238,0x0000,0x2238,0x0000,0x2238,0x0000,0x476a,0x0000,0x4772,0x0000,0x223c,0x0000,0x223c,0x0000,0x223c,0x0000,0x223c,0x0000,0x2240,0x0000,0x2240,0x0000,0x2240,0x0000,0x2240,0x0000,0x477e,0x4786,0x478e,0x4796,0x2244,0x0000,0x2244,0x0000,0x2244,0x0000,0x2244,0x0000,0x0000,0x2248,0x0000,0x2248,0x0000,0x2248,0x0000,0x2248,0x224c,0x0000,0x224c,0x0000,0x224c,0x0000,0x224c,0x0000,0x0000,0x2250,0x0000,0x2250,0x0000,0x2250,0x0000,0x2250,0x47a2,0x47aa,0x47b2,0x0000,0x2254,0x2258,0x2254,0x2258,0x2254,0x2258,0x2254,0x2258,0x225c,0x0000,0x225c,0x0000,0x225c,0x0000,0x225c,0x0000,0x2260,0x0000,0x2260,0x0000,0x2260,0x0000,0x2260,0x0000,0x47be,0x0000,0x47c6,0x0000,0x2264,0x0000,0x2264,0x0000,0x2264,0x0000,0x2264,0x0000,0x2268,0x0000,0x2268,0x0000,0x2268,0x0000,0x2268,0x0000,0x47d2,0x0000,0x47da,0x0000,0x226c,0x0000,0x226c,0x0000,0x226c,0x0000,0x226c,0x0000,0x2270,0x0000,0x2270,0x0000,0x2270,0x0000,0x2270,0x0000,0x47e6,0x0000,0x47ee,0x0000,0x2274,0x0000,0x2274,0x0000,0x2274,0x0000,0x2274,0x0000,0x2278,0x0000,0x2278,0x0000,0x2278,0x0000,0x2278,0x0000,0x47fa,0x0000,0x4802,0x0000,0x227c,0x0000,0x227c,0x0000,0x227c,0x0000,0x227c,0x0000,0x2280,0x0000,0x2280,0x0000,0x2280,0x0000,0x2280,0x0000,0x0000,0x480e,0x0000,0x0000,0x2284,0x2284,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x481a,0x4822,0x2290,0x0000,0x2288,0x0000,0x2288,0x0000,0x2288,0x0000,0x2288,0x0000,0x228c,0x0000,0x228c,0x0000,0x228c,0x0000,0x228c,0x0000,0x482e,0x4836,0x229c,0x0000,0x2294,0x0000,0x2294,0x0000,0x2294,0x0000,0x2294,0x0000,0x2298,0x0000,0x2298,0x0000,0x2298,0x0000,0x2298,0x0000,0x0000,0x4842,0x0000,0x484a,0x22a0,0x0000,0x22a0,0x0000,0x22a0,0x0000,0x22a0,0x0000,0x22a4,0x22a8,0x22a4,0x22a8,0x22a4,0x22a8,0x22a4,0x22a8,0x0000,0x4856,0x22b0,0x0000,0x22ac,0x0000,0x22ac,0x0000,0x22ac,0x0000,0x22ac,0x0000,0x4862,0x486a,0x0000,0x0000,0x22b4,0x0000,0x22b4,0x0000,0x22b4,0x0000,0x22b4,0x0000,0x22b8,0x0000,0x22b8,0x0000,0x22b8,0x0000,0x22b8,0x0000,0x4876,0x487e,0x4886,0x488e,0x22bc,0x0000,0x22bc,0x0000,0x22bc,0x0000,0x22bc,0x0000,0x22c0,0x0000,0x22c0,0x0000,0x22c0,0x0000,0x22c0,0x0000,0x22c4,0x0000,0x22c4,0x0000,0x22c4,0x0000,0x22c4,0x0000,0x22c8,0x0000,0x22c8,0x0000,0x22c8,0x0000,0x22c8,0x0000,0x0000,0x489a,0x0000,0x0000,0x22cc,0x22cc,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x49a3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x49b7,0x49c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x49cf,0x49db,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x49e7,0x49f3,0x49ff,0x4a0b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a17,0x4a2b,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a67,0x4a8b,0x4aaf,0x4ad3,0x4af7,0x4b1b,0x4b3f,0x4b63,0x4b87,0x4bab,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a73,0x4a97,0x4abb,0x4adf,0x4b03,0x4b27,0x4b4b,0x4b6f,0x4b93,0x4bb7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a7f,0x4aa3,0x4ac7,0x4aeb,0x4b0f,0x4b33,0x4b57,0x4b7b,0x4b9f,0x4bc3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a3f,0x4a53,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x49ae,0x49a6,0x0000,0x0000,0x22d0,0x0000,0x22d0,0x0000,0x22d0,0x0000,0x22d0,0x0000,0x22d4,0x0000,0x22d4,0x0000,0x22d4,0x0000,0x22d4,0x0000,0x0000,0x49ba,0x0000,0x0000,0x22d8,0x0000,0x22d8,0x0000,0x22d8,0x0000,0x22d8,0x0000,0x0000,0x49c6,0x0000,0x0000,0x22dc,0x0000,0x22dc,0x0000,0x22dc,0x0000,0x22dc,0x0000,0x0000,0x49d2,0x0000,0x0000,0x22e0,0x0000,0x22e0,0x0000,0x22e0,0x0000,0x22e0,0x0000,0x0000,0x49de,0x0000,0x0000,0x22e4,0x0000,0x22e4,0x0000,0x22e4,0x0000,0x22e4,0x0000,0x0000,0x49ea,0x0000,0x0000,0x22e8,0x0000,0x22e8,0x0000,0x22e8,0x0000,0x22e8,0x0000,0x0000,0x49f6,0x0000,0x0000,0x22ec,0x0000,0x22ec,0x0000,0x22ec,0x0000,0x22ec,0x0000,0x0000,0x4a02,0x0000,0x0000,0x22f0,0x0000,0x22f0,0x0000,0x22f0,0x0000,0x22f0,0x0000,0x0000,0x4a0e,0x0000,0x0000,0x22f4,0x0000,0x22f4,0x0000,0x22f4,0x0000,0x22f4,0x0000,0x0000,0x0000,0x4a1a,0x4a22,0x22f8,0x0000,0x22f8,0x0000,0x22f8,0x0000,0x22f8,0x0000,0x22fc,0x0000,0x22fc,0x0000,0x22fc,0x0000,0x22fc,0x0000,0x0000,0x0000,0x4a2e,0x4a36,0x2300,0x0000,0x2300,0x0000,0x2300,0x0000,0x2300,0x0000,0x2304,0x0000,0x2304,0x0000,0x2304,0x0000,0x2304,0x0000,0x0000,0x0000,0x4a42,0x4a4a,0x2308,0x0000,0x2308,0x0000,0x2308,0x0000,0x2308,0x0000,0x230c,0x0000,0x230c,0x0000,0x230c,0x0000,0x230c,0x0000,0x0000,0x0000,0x4a56,0x4a5e,0x2310,0x0000,0x2310,0x0000,0x2310,0x0000,0x2310,0x0000,0x2314,0x0000,0x2314,0x0000,0x2314,0x0000,0x2314,0x0000,0x0000,0x4a6a,0x0000,0x0000,0x2318,0x0000,0x2318,0x0000,0x2318,0x0000,0x2318,0x0000,0x0000,0x4a76,0x0000,0x0000,0x231c,0x0000,0x231c,0x0000,0x231c,0x0000,0x231c,0x0000,0x0000,0x4a82,0x0000,0x0000,0x2320,0x0000,0x2320,0x0000,0x2320,0x0000,0x2320,0x0000,0x0000,0x4a8e,0x0000,0x0000,0x2324,0x0000,0x2324,0x0000,0x2324,0x0000,0x2324,0x0000,0x0000,0x4a9a,0x0000,0x0000,0x2328,0x0000,0x2328,0x0000,0x2328,0x0000,0x2328,0x0000,0x0000,0x4aa6,0x0000,0x0000,0x232c,0x0000,0x232c,0x0000,0x232c,0x0000,0x232c,0x0000,0x0000,0x4ab2,0x0000,0x0000,0x2330,0x0000,0x2330,0x0000,0x2330,0x0000,0x2330,0x0000,0x0000,0x4abe,0x0000,0x0000,0x2334,0x0000,0x2334,0x0000,0x2334,0x0000,0x2334,0x0000,0x0000,0x4aca,0x0000,0x0000,0x2338,0x0000,0x2338,0x0000,0x2338,0x0000,0x2338,0x0000,0x0000,0x4ad6,0x0000,0x0000,0x233c,0x0000,0x233c,0x0000,0x233c,0x0000,0x233c,0x0000,0x0000,0x4ae2,0x0000,0x0000,0x2340,0x0000,0x2340,0x0000,0x2340,0x0000,0x2340,0x0000,0x0000,0x4aee,0x0000,0x0000,0x2344,0x0000,0x2344,0x0000,0x2344,0x0000,0x2344,0x0000,0x0000,0x4afa,0x0000,0x0000,0x2348,0x0000,0x2348,0x0000,0x2348,0x0000,0x2348,0x0000,0x0000,0x4b06,0x0000,0x0000,0x234c,0x0000,0x234c,0x0000,0x234c,0x0000,0x234c,0x0000,0x0000,0x4b12,0x0000,0x0000,0x2350,0x0000,0x2350,0x0000,0x2350,0x0000,0x2350,0x0000,0x0000,0x4b1e,0x0000,0x0000,0x2354,0x0000,0x2354,0x0000,0x2354,0x0000,0x2354,0x0000,0x0000,0x4b2a,0x0000,0x0000,0x2358,0x0000,0x2358,0x0000,0x2358,0x0000,0x2358,0x0000,0x0000,0x4b36,0x0000,0x0000,0x235c,0x0000,0x235c,0x0000,0x235c,0x0000,0x235c,0x0000,0x0000,0x4b42,0x0000,0x0000,0x2360,0x0000,0x2360,0x0000,0x2360,0x0000,0x2360,0x0000,0x0000,0x4b4e,0x0000,0x0000,0x2364,0x0000,0x2364,0x0000,0x2364,0x0000,0x2364,0x0000,0x0000,0x4b5a,0x0000,0x0000,0x2368,0x0000,0x2368,0x0000,0x2368,0x0000,0x2368,0x0000,0x0000,0x4b66,0x0000,0x0000,0x236c,0x0000,0x236c,0x0000,0x236c,0x0000,0x236c,0x0000,0x0000,0x4b72,0x0000,0x0000,0x2370,0x0000,0x2370,0x0000,0x2370,0x0000,0x2370,0x0000,0x0000,0x4b7e,0x0000,0x0000,0x2374,0x0000,0x2374,0x0000,0x2374,0x0000,0x2374,0x0000,0x0000,0x4b8a,0x0000,0x0000,0x2378,0x0000,0x2378,0x0000,0x2378,0x0000,0x2378,0x0000,0x0000,0x4b96,0x0000,0x0000,0x237c,0x0000,0x237c,0x0000,0x237c,0x0000,0x237c,0x0000,0x0000,0x4ba2,0x0000,0x0000,0x2380,0x0000,0x2380,0x0000,0x2380,0x0000,0x2380,0x0000,0x0000,0x4bae,0x0000,0x0000,0x2384,0x0000,0x2384,0x0000,0x2384,0x0000,0x2384,0x0000,0x0000,0x4bba,0x0000,0x0000,0x2388,0x0000,0x2388,0x0000,0x2388,0x0000,0x2388,0x0000,0x0000,0x4bc6,0x0000,0x0000,0x238c,0x0000,0x238c,0x0000,0x238c,0x0000,0x238c,0x0000, -#elif defined(FD_DECODE_TABLE_DESCS) -{0},{FDI_ADD, 2059, 1280, 16393},{FDI_ADD, 2059, 1034, 16393},{FDI_ADD, 14, 1280, 16393},{FDI_ADD, 14, 1034, 16393},{FDI_ADD, 20656, 1344, 64},{FDI_ADD, 16560, 1184, 64},{FDI_PUSH, 12, 1032, 24},{FDI_POP, 12, 1032, 24},{FDI_OR, 2059, 1280, 16393},{FDI_OR, 2059, 1034, 16393},{FDI_OR, 14, 1280, 16393},{FDI_OR, 14, 1034, 16393},{FDI_OR, 20656, 1344, 64},{FDI_OR, 16560, 1184, 64},{FDI_ADC, 2059, 1280, 16393},{FDI_ADC, 2059, 1034, 16393},{FDI_ADC, 14, 1280, 16393},{FDI_ADC, 14, 1034, 16393},{FDI_ADC, 20656, 1344, 64},{FDI_ADC, 16560, 1184, 64},{FDI_SBB, 2059, 1280, 16393},{FDI_SBB, 2059, 1034, 16393},{FDI_SBB, 14, 1280, 16393},{FDI_SBB, 14, 1034, 16393},{FDI_SBB, 20656, 1344, 64},{FDI_SBB, 16560, 1184, 64},{FDI_AND, 2059, 1280, 16393},{FDI_AND, 2059, 1034, 16393},{FDI_AND, 14, 1280, 16393},{FDI_AND, 14, 1034, 16393},{FDI_AND, 20656, 1344, 64},{FDI_AND, 16560, 1184, 64},{FDI_DAA, 0, 1024, 0},{FDI_SUB, 2059, 1280, 16393},{FDI_SUB, 2059, 1034, 16393},{FDI_SUB, 14, 1280, 16393},{FDI_SUB, 14, 1034, 16393},{FDI_SUB, 20656, 1344, 64},{FDI_SUB, 16560, 1184, 64},{FDI_DAS, 0, 1024, 0},{FDI_XOR, 2059, 1280, 16393},{FDI_XOR, 2059, 1034, 16393},{FDI_XOR, 14, 1280, 16393},{FDI_XOR, 14, 1034, 16393},{FDI_XOR, 20656, 1344, 64},{FDI_XOR, 16560, 1184, 64},{FDI_AAA, 0, 1024, 0},{FDI_CMP, 11, 1280, 16393},{FDI_CMP, 11, 1034, 16393},{FDI_CMP, 14, 1280, 16393},{FDI_CMP, 14, 1034, 16393},{FDI_CMP, 20656, 1344, 64},{FDI_CMP, 16560, 1184, 64},{FDI_AAS, 0, 1024, 0},{FDI_INC, 3, 1026, 1},{FDI_DEC, 3, 1026, 1},{FDI_PUSH, 3, 1026, 4097},{FDI_POP, 3, 1026, 4097},{FDI_PUSHA, 0, 34048, 0},{FDI_POPA, 0, 34048, 0},{FDI_BOUND, 14, 1034, 16392},{FDI_ARPL, 11, 2048, 16393},{FDI_MOVSX, 14, 3336, 16393},{FDI_PUSH, 16576, 1152, 4096},{FDI_IMUL, 16462, 1162, 16393},{FDI_PUSH, 20672, 1024, 4096},{FDI_IMUL, 20558, 1034, 16393},{FDI_INS, 0, 1280, 0},{FDI_INS, 0, 34048, 0},{FDI_OUTS, 0, 1280, 0},{FDI_OUTS, 0, 34048, 0},{FDI_JO, 28864, 1024, 6144},{FDI_JNO, 28864, 1024, 6144},{FDI_JC, 28864, 1024, 6144},{FDI_JNC, 28864, 1024, 6144},{FDI_JZ, 28864, 1024, 6144},{FDI_JNZ, 28864, 1024, 6144},{FDI_JBE, 28864, 1024, 6144},{FDI_JA, 28864, 1024, 6144},{FDI_JS, 28864, 1024, 6144},{FDI_JNS, 28864, 1024, 6144},{FDI_JP, 28864, 1024, 6144},{FDI_JNP, 28864, 1024, 6144},{FDI_JL, 28864, 1024, 6144},{FDI_JGE, 28864, 1024, 6144},{FDI_JLE, 28864, 1024, 6144},{FDI_JG, 28864, 1024, 6144},{FDI_ADD, 22659, 1344, 16385},{FDI_OR, 22659, 1344, 16385},{FDI_ADC, 22659, 1344, 16385},{FDI_SBB, 22659, 1344, 16385},{FDI_AND, 22659, 1344, 16385},{FDI_SUB, 22659, 1344, 16385},{FDI_XOR, 22659, 1344, 16385},{FDI_CMP, 20611, 1344, 16385},{FDI_ADD, 18563, 1154, 16385},{FDI_OR, 18563, 1154, 16385},{FDI_ADC, 18563, 1154, 16385},{FDI_SBB, 18563, 1154, 16385},{FDI_AND, 18563, 1154, 16385},{FDI_SUB, 18563, 1154, 16385},{FDI_XOR, 18563, 1154, 16385},{FDI_CMP, 16515, 1154, 16385},{FDI_ADD, 22659, 1026, 16385},{FDI_OR, 22659, 1026, 16385},{FDI_ADC, 22659, 1026, 16385},{FDI_SBB, 22659, 1026, 16385},{FDI_AND, 22659, 1026, 16385},{FDI_SUB, 22659, 1026, 16385},{FDI_XOR, 22659, 1026, 16385},{FDI_CMP, 20611, 1026, 16385},{FDI_TEST, 11, 1280, 16393},{FDI_TEST, 11, 1034, 16393},{FDI_XCHG, 2059, 1280, 16393},{FDI_XCHG, 2059, 1034, 16393},{FDI_MOV, 11, 1280, 16393},{FDI_MOV, 11, 1034, 16393},{FDI_MOV, 14, 1280, 16393},{FDI_MOV, 14, 1034, 16393},{FDI_MOV_S2G, 11, 2048, 16409},{FDI_LEA, 14, 8, 16392},{FDI_MOV_G2S, 14, 2048, 16409},{FDI_POP, 3, 1026, 20481},{FDI_XCHG_NOP, 35, 1314, 65},{FDI_C_EX, 0, 34048, 0},{FDI_C_SEP, 0, 34048, 0},{FDI_CALLF, 16576, 1152, 0},{FDI_FWAIT, 0, 1024, 0},{FDI_PUSHF, 0, 34048, 4096},{FDI_POPF, 0, 34048, 4096},{FDI_SAHF, 0, 1024, 0},{FDI_LAHF, 0, 1024, 0},{FDI_MOV, 8368, 1280, 64},{FDI_MOV, 8368, 1184, 64},{FDI_MOV, 8416, 1280, 64},{FDI_MOV, 8416, 1184, 64},{FDI_MOVS, 0, 1280, 0},{FDI_MOVS, 0, 34048, 0},{FDI_CMPS, 0, 1280, 0},{FDI_CMPS, 0, 34048, 0},{FDI_TEST, 20656, 1344, 64},{FDI_TEST, 16560, 1184, 64},{FDI_STOS, 0, 1280, 0},{FDI_STOS, 0, 34048, 0},{FDI_LODS, 0, 1280, 0},{FDI_LODS, 0, 34048, 0},{FDI_SCAS, 0, 1280, 0},{FDI_SCAS, 0, 34048, 0},{FDI_MOVABS, 20611, 1344, 1},{FDI_MOVABS, 16515, 1154, 1},{FDI_ROL, 20611, 1344, 16385},{FDI_ROR, 20611, 1344, 16385},{FDI_RCL, 20611, 1344, 16385},{FDI_RCR, 20611, 1344, 16385},{FDI_SHL, 20611, 1344, 16385},{FDI_SHR, 20611, 1344, 16385},{FDI_SAR, 20611, 1344, 16385},{FDI_ROL, 20611, 1090, 16385},{FDI_ROR, 20611, 1090, 16385},{FDI_RCL, 20611, 1090, 16385},{FDI_RCR, 20611, 1090, 16385},{FDI_SHL, 20611, 1090, 16385},{FDI_SHR, 20611, 1090, 16385},{FDI_SAR, 20611, 1090, 16385},{FDI_RET, 16576, 35072, 6144},{FDI_RET, 0, 34048, 6144},{FDI_LES, 14, 1034, 16392},{FDI_LDS, 14, 1034, 16392},{FDI_MOV, 20611, 1344, 16385},{FDI_XABORT, 20672, 1088, 16384},{FDI_MOV, 16515, 1154, 16385},{FDI_XBEGIN, 24768, 3072, 16384},{FDI_XBEGIN, 24768, 4096, 16384},{FDI_ENTER, 16576, 36096, 4096},{FDI_LEAVE, 0, 34048, 4096},{FDI_RETF, 16576, 35072, 0},{FDI_RETF, 0, 34048, 0},{FDI_INT3, 0, 1024, 0},{FDI_INT, 20672, 1088, 0},{FDI_INTO, 0, 1024, 0},{FDI_IRET, 0, 34048, 0},{FDI_ROL, 4227, 1280, 16385},{FDI_ROR, 4227, 1280, 16385},{FDI_RCL, 4227, 1280, 16385},{FDI_RCR, 4227, 1280, 16385},{FDI_SHL, 4227, 1280, 16385},{FDI_SHR, 4227, 1280, 16385},{FDI_SAR, 4227, 1280, 16385},{FDI_ROL, 4227, 1026, 16385},{FDI_ROR, 4227, 1026, 16385},{FDI_RCL, 4227, 1026, 16385},{FDI_RCR, 4227, 1026, 16385},{FDI_SHL, 4227, 1026, 16385},{FDI_SHR, 4227, 1026, 16385},{FDI_SAR, 4227, 1026, 16385},{FDI_ROL, 1059, 1280, 16449},{FDI_ROR, 1059, 1280, 16449},{FDI_RCL, 1059, 1280, 16449},{FDI_RCR, 1059, 1280, 16449},{FDI_SHL, 1059, 1280, 16449},{FDI_SHR, 1059, 1280, 16449},{FDI_SAR, 1059, 1280, 16449},{FDI_ROL, 1059, 1026, 16449},{FDI_ROR, 1059, 1026, 16449},{FDI_RCL, 1059, 1026, 16449},{FDI_RCR, 1059, 1026, 16449},{FDI_SHL, 1059, 1026, 16449},{FDI_SHR, 1059, 1026, 16449},{FDI_SAR, 1059, 1026, 16449},{FDI_AAM, 20672, 1344, 0},{FDI_AAD, 20672, 1344, 0},{FDI_XLATB, 0, 1024, 0},{FDI_LOOPNZ, 28864, 1024, 6144},{FDI_LOOPZ, 28864, 1024, 6144},{FDI_LOOP, 28864, 1024, 6144},{FDI_JCXZ, 28864, 1024, 6144},{FDI_IN, 20656, 1344, 64},{FDI_IN, 20656, 1120, 64},{FDI_OUT, 20656, 1344, 64},{FDI_OUT, 20656, 1120, 64},{FDI_CALL, 24768, 1152, 6144},{FDI_JMP, 24768, 1152, 6144},{FDI_JMPF, 16576, 1152, 0},{FDI_JMP, 28864, 1024, 6144},{FDI_IN, 0, 1280, 0},{FDI_IN, 0, 34048, 0},{FDI_OUT, 0, 1280, 0},{FDI_OUT, 0, 34048, 0},{FDI_INT1, 0, 1024, 0},{FDI_HLT, 0, 1024, 0},{FDI_CMC, 0, 1024, 0},{FDI_TEST, 20611, 1344, 16385},{FDI_NOT, 2051, 1280, 16385},{FDI_NEG, 2051, 1280, 16385},{FDI_MUL, 3, 1280, 16385},{FDI_IMUL, 3, 1280, 16385},{FDI_DIV, 3, 1280, 16385},{FDI_IDIV, 3, 1280, 16385},{FDI_TEST, 16515, 1154, 16385},{FDI_NOT, 2051, 1026, 16385},{FDI_NEG, 2051, 1026, 16385},{FDI_MUL, 3, 1026, 16385},{FDI_IMUL, 3, 1026, 16385},{FDI_DIV, 3, 1026, 16385},{FDI_IDIV, 3, 1026, 16385},{FDI_CLC, 0, 1024, 0},{FDI_STC, 0, 1024, 0},{FDI_CLI, 0, 1024, 0},{FDI_STI, 0, 1024, 0},{FDI_CLD, 0, 1024, 0},{FDI_STD, 0, 1024, 0},{FDI_INC, 2051, 1280, 16385},{FDI_DEC, 2051, 1280, 16385},{FDI_INC, 2051, 1026, 16385},{FDI_DEC, 2051, 1026, 16385},{FDI_CALL, 3, 1026, 22529},{FDI_CALLF, 3, 1026, 16384},{FDI_JMP, 3, 1026, 22529},{FDI_JMPF, 3, 1026, 16384},{FDI_PUSH, 3, 1026, 20481},{FDI_SLDT, 3, 2048, 16385},{FDI_STR, 3, 2048, 16385},{FDI_LLDT, 3, 2048, 16385},{FDI_LTR, 3, 2048, 16385},{FDI_VERR, 3, 2048, 16385},{FDI_VERW, 3, 2048, 16385},{FDI_SGDT, 3, 0, 16384},{FDI_SIDT, 3, 0, 16384},{FDI_LGDT, 3, 0, 16384},{FDI_LIDT, 3, 0, 16384},{FDI_SMSW, 3, 2048, 16384},{FDI_SMSW, 3, 1026, 16385},{FDI_LMSW, 3, 2048, 16385},{FDI_INVLPG, 3, 1280, 16384},{FDI_ENCLV, 0, 1024, 49152},{FDI_MONITOR, 0, 1024, 49152},{FDI_MWAIT, 0, 1024, 49152},{FDI_CLAC, 0, 1024, 49152},{FDI_STAC, 0, 1024, 49152},{FDI_ENCLS, 0, 1024, 49152},{FDI_XGETBV, 0, 1024, 49152},{FDI_XSETBV, 0, 1024, 49152},{FDI_XEND, 0, 1024, 49152},{FDI_XTEST, 0, 1024, 49152},{FDI_ENCLU, 0, 1024, 49152},{FDI_SWAPGS, 0, 1024, 16384},{FDI_RDTSCP, 0, 1024, 16384},{FDI_LAR, 14, 2056, 16393},{FDI_LSL, 14, 2056, 16393},{FDI_SYSCALL, 0, 1024, 0},{FDI_CLTS, 0, 1024, 0},{FDI_SYSRET, 0, 1024, 0},{FDI_INVD, 0, 1024, 0},{FDI_WBINVD, 0, 1024, 0},{FDI_UD2, 0, 1024, 0},{FDI_PREFETCH, 3, 1024, 16384},{FDI_PREFETCHW, 3, 1024, 16384},{FDI_PREFETCHWT1, 3, 1024, 16384},{FDI_RESERVED_PREFETCH, 3, 1024, 16384},{FDI_RESERVED_NOP, 11, 1034, 16393},{FDI_FEMMS, 0, 1024, 0},{FDI_3DNOW, 20558, 4416, 16429},{FDI_PREFETCHNTA, 3, 1024, 16384},{FDI_PREFETCHT0, 3, 1024, 16384},{FDI_PREFETCHT1, 3, 1024, 16384},{FDI_PREFETCHT2, 3, 1024, 16384},{FDI_PREFETCHIT1, 3, 1024, 16384},{FDI_PREFETCHIT0, 3, 1024, 16384},{FDI_NOP, 3, 1026, 16385},{FDI_MOV_CR, 11, 1034, 53249},{FDI_MOV_DR, 11, 1034, 53249},{FDI_MOV_CR, 14, 1034, 53249},{FDI_MOV_DR, 14, 1034, 53249},{FDI_WRMSR, 0, 1024, 0},{FDI_RDTSC, 0, 1024, 0},{FDI_RDMSR, 0, 1024, 0},{FDI_RDPMC, 0, 1024, 0},{FDI_SYSENTER, 0, 1024, 0},{FDI_SYSEXIT, 0, 1024, 0},{FDI_GETSEC, 0, 1024, 32768},{FDI_CMOVO, 14, 1034, 16393},{FDI_CMOVNO, 14, 1034, 16393},{FDI_CMOVC, 14, 1034, 16393},{FDI_CMOVNC, 14, 1034, 16393},{FDI_CMOVZ, 14, 1034, 16393},{FDI_CMOVNZ, 14, 1034, 16393},{FDI_CMOVBE, 14, 1034, 16393},{FDI_CMOVA, 14, 1034, 16393},{FDI_CMOVS, 14, 1034, 16393},{FDI_CMOVNS, 14, 1034, 16393},{FDI_CMOVP, 14, 1034, 16393},{FDI_CMOVNP, 14, 1034, 16393},{FDI_CMOVL, 14, 1034, 16393},{FDI_CMOVGE, 14, 1034, 16393},{FDI_CMOVLE, 14, 1034, 16393},{FDI_CMOVG, 14, 1034, 16393},{FDI_JO, 24768, 1152, 6144},{FDI_JNO, 24768, 1152, 6144},{FDI_JC, 24768, 1152, 6144},{FDI_JNC, 24768, 1152, 6144},{FDI_JZ, 24768, 1152, 6144},{FDI_JNZ, 24768, 1152, 6144},{FDI_JBE, 24768, 1152, 6144},{FDI_JA, 24768, 1152, 6144},{FDI_JS, 24768, 1152, 6144},{FDI_JNS, 24768, 1152, 6144},{FDI_JP, 24768, 1152, 6144},{FDI_JNP, 24768, 1152, 6144},{FDI_JL, 24768, 1152, 6144},{FDI_JGE, 24768, 1152, 6144},{FDI_JLE, 24768, 1152, 6144},{FDI_JG, 24768, 1152, 6144},{FDI_SETO, 3, 1280, 16385},{FDI_SETNO, 3, 1280, 16385},{FDI_SETC, 3, 1280, 16385},{FDI_SETNC, 3, 1280, 16385},{FDI_SETZ, 3, 1280, 16385},{FDI_SETNZ, 3, 1280, 16385},{FDI_SETBE, 3, 1280, 16385},{FDI_SETA, 3, 1280, 16385},{FDI_SETS, 3, 1280, 16385},{FDI_SETNS, 3, 1280, 16385},{FDI_SETP, 3, 1280, 16385},{FDI_SETNP, 3, 1280, 16385},{FDI_SETL, 3, 1280, 16385},{FDI_SETGE, 3, 1280, 16385},{FDI_SETLE, 3, 1280, 16385},{FDI_SETG, 3, 1280, 16385},{FDI_PUSH, 12, 1032, 4120},{FDI_POP, 12, 1032, 4120},{FDI_CPUID, 0, 1024, 0},{FDI_BT, 11, 1034, 16393},{FDI_SHLD, 20555, 1098, 16393},{FDI_SHLD, 1051, 1034, 16457},{FDI_RSM, 0, 1024, 0},{FDI_BTS, 2059, 1034, 16393},{FDI_SHRD, 20555, 1098, 16393},{FDI_SHRD, 1051, 1034, 16457},{FDI_IMUL, 14, 1034, 16393},{FDI_CMPXCHG, 2059, 1280, 16393},{FDI_CMPXCHG, 2059, 1034, 16393},{FDI_LSS, 14, 1034, 16392},{FDI_BTR, 2059, 1034, 16393},{FDI_LFS, 14, 1034, 16392},{FDI_LGS, 14, 1034, 16392},{FDI_MOVZX, 14, 1288, 16393},{FDI_MOVZX, 14, 2312, 16393},{FDI_POPCNT, 14, 1034, 16393},{FDI_UD1, 14, 1034, 16393},{FDI_BT, 20611, 1090, 16385},{FDI_BTS, 22659, 1090, 16385},{FDI_BTR, 22659, 1090, 16385},{FDI_BTC, 22659, 1090, 16385},{FDI_BTC, 2059, 1034, 16393},{FDI_BSF, 14, 1034, 16393},{FDI_TZCNT, 14, 1034, 16393},{FDI_BSR, 14, 1034, 16393},{FDI_LZCNT, 14, 1034, 16393},{FDI_MOVSX, 14, 1288, 16393},{FDI_MOVSX, 14, 2312, 16393},{FDI_XADD, 2059, 1280, 16393},{FDI_XADD, 2059, 1034, 16393},{FDI_MOVNTI, 11, 1034, 49160},{FDI_CMPXCHGD, 2051, 33024, 49152},{FDI_BSWAP, 3, 1026, 1},{FDI_UD0, 14, 1034, 16393},{FDI_MOVBE, 14, 1034, 16392},{FDI_CRC32, 14, 17668, 49161},{FDI_MOVBE, 11, 1034, 16392},{FDI_CRC32, 14, 3074, 16393},{FDI_MMX_CVTPI2PS, 14, 4096, 49157},{FDI_MMX_CVTPI2PD, 14, 29697, 49157},{FDI_MMX_CVTTPS2PI, 14, 4096, 49192},{FDI_MMX_CVTTPD2PI, 14, 29700, 49192},{FDI_MMX_CVTPS2PI, 14, 4096, 49192},{FDI_MMX_CVTPD2PI, 14, 29700, 49192},{FDI_MMX_PUNPCKLBW, 14, 27652, 49197},{FDI_MMX_PUNPCKLWD, 14, 27652, 49197},{FDI_MMX_PUNPCKLDQ, 14, 27652, 49197},{FDI_MMX_PACKSSWB, 14, 4096, 49197},{FDI_MMX_PCMPGTB, 14, 4096, 49197},{FDI_MMX_PCMPGTW, 14, 4096, 49197},{FDI_MMX_PCMPGTD, 14, 4096, 49197},{FDI_MMX_PACKUSWB, 14, 4096, 49197},{FDI_MMX_PUNPCKHBW, 14, 4096, 49197},{FDI_MMX_PUNPCKHWD, 14, 4096, 49197},{FDI_MMX_PUNPCKHDQ, 14, 4096, 49197},{FDI_MMX_PACKSSDW, 14, 4096, 49197},{FDI_MMX_MOVD, 14, 4098, 49193},{FDI_MMX_MOVQ, 14, 4098, 49193},{FDI_MMX_MOVQ, 14, 4096, 49197},{FDI_MMX_PSHUFW, 20558, 4160, 49197},{FDI_MMX_PSRLW, 20611, 4160, 49157},{FDI_MMX_PSRAW, 20611, 4160, 49157},{FDI_MMX_PSLLW, 20611, 4160, 49157},{FDI_MMX_PSRLD, 20611, 4160, 49157},{FDI_MMX_PSRAD, 20611, 4160, 49157},{FDI_MMX_PSLLD, 20611, 4160, 49157},{FDI_MMX_PSRLQ, 20611, 4160, 49157},{FDI_MMX_PSLLQ, 20611, 4160, 49157},{FDI_MMX_PCMPEQB, 14, 4096, 49197},{FDI_MMX_PCMPEQW, 14, 4096, 49197},{FDI_MMX_PCMPEQD, 14, 4096, 49197},{FDI_MMX_EMMS, 0, 1024, 32768},{FDI_MMX_MOVD, 11, 1034, 49193},{FDI_MMX_MOVQ, 11, 1034, 49193},{FDI_MMX_MOVQ, 11, 4096, 49197},{FDI_MMX_PINSRW, 20558, 26692, 49193},{FDI_MMX_PEXTRW, 20558, 4168, 53261},{FDI_MMX_PSRLW, 14, 4096, 49197},{FDI_MMX_PSRLD, 14, 4096, 49197},{FDI_MMX_PSRLQ, 14, 4096, 49197},{FDI_MMX_PADDQ, 14, 4096, 49197},{FDI_MMX_PMULLW, 14, 4096, 49197},{FDI_MMX_MOVDQ2Q, 14, 4096, 49192},{FDI_MMX_MOVQ2DQ, 14, 29697, 49157},{FDI_MMX_PMOVMSKB, 14, 4104, 53261},{FDI_MMX_PSUBUSB, 14, 4096, 49197},{FDI_MMX_PSUBUSW, 14, 4096, 49197},{FDI_MMX_PMINUB, 14, 4096, 49197},{FDI_MMX_PAND, 14, 4096, 49197},{FDI_MMX_PADDUSB, 14, 4096, 49197},{FDI_MMX_PADDUSW, 14, 4096, 49197},{FDI_MMX_PMAXUB, 14, 4096, 49197},{FDI_MMX_PANDN, 14, 4096, 49197},{FDI_MMX_PAVGB, 14, 4096, 49197},{FDI_MMX_PSRAW, 14, 4096, 49197},{FDI_MMX_PSRAD, 14, 4096, 49197},{FDI_MMX_PAVGW, 14, 4096, 49197},{FDI_MMX_PMULHUW, 14, 4096, 49197},{FDI_MMX_PMULHW, 14, 4096, 49197},{FDI_MMX_MOVNTQ, 11, 4096, 49192},{FDI_MMX_PSUBSB, 14, 4096, 49197},{FDI_MMX_PSUBSW, 14, 4096, 49197},{FDI_MMX_POR, 14, 4096, 49197},{FDI_MMX_PADDSB, 14, 4096, 49197},{FDI_MMX_PMINSW, 14, 4096, 49197},{FDI_MMX_PMAXSW, 14, 4096, 49197},{FDI_MMX_PADDSW, 14, 4096, 49197},{FDI_MMX_PXOR, 14, 4096, 49197},{FDI_MMX_PSLLW, 14, 4096, 49197},{FDI_MMX_PSLLD, 14, 4096, 49197},{FDI_MMX_PSLLQ, 14, 4096, 49197},{FDI_MMX_PMULUDQ, 14, 4096, 49197},{FDI_MMX_PMADDWD, 14, 4096, 49197},{FDI_MMX_PSADBW, 14, 4096, 49197},{FDI_MMX_MASKMOVQ, 14, 4096, 49197},{FDI_MMX_PSUBB, 14, 4096, 49197},{FDI_MMX_PSUBW, 14, 4096, 49197},{FDI_MMX_PSUBD, 14, 4096, 49197},{FDI_MMX_PSUBQ, 14, 4096, 49197},{FDI_MMX_PADDB, 14, 4096, 49197},{FDI_MMX_PADDW, 14, 4096, 49197},{FDI_MMX_PADDD, 14, 4096, 49197},{FDI_MMX_PSHUFB, 14, 4096, 49197},{FDI_MMX_PHADDW, 14, 4096, 49197},{FDI_MMX_PHADDD, 14, 4096, 49197},{FDI_MMX_PHADDSW, 14, 4096, 49197},{FDI_MMX_PMADDUBSW, 14, 4096, 49197},{FDI_MMX_PHSUBW, 14, 4096, 49197},{FDI_MMX_PHSUBD, 14, 4096, 49197},{FDI_MMX_PHSUBSW, 14, 4096, 49197},{FDI_MMX_PSIGNB, 14, 4096, 49197},{FDI_MMX_PSIGNW, 14, 4096, 49197},{FDI_MMX_PSIGND, 14, 4096, 49197},{FDI_MMX_PMULHRSW, 14, 4096, 49197},{FDI_MMX_PABSB, 14, 4096, 49197},{FDI_MMX_PABSW, 14, 4096, 49197},{FDI_MMX_PABSD, 14, 4096, 49197},{FDI_MMX_PALIGNR, 20558, 4160, 49197},{FDI_SSE_MOVUPS, 14, 1034, 57344},{FDI_SSE_MOVUPD, 14, 1034, 57344},{FDI_SSE_MOVSS, 14, 3080, 57344},{FDI_SSE_MOVSD, 14, 4104, 57344},{FDI_SSE_MOVUPS, 11, 1034, 57344},{FDI_SSE_MOVUPD, 11, 1034, 57344},{FDI_SSE_MOVSS, 11, 3072, 49152},{FDI_SSE_MOVSD, 11, 4096, 49152},{FDI_SSE_MOVLPS, 14, 4104, 57344},{FDI_SSE_MOVHLPS, 14, 1034, 57344},{FDI_SSE_MOVLPD, 14, 4104, 57344},{FDI_SSE_MOVSLDUP, 14, 1034, 57344},{FDI_SSE_MOVDDUP, 14, 4104, 57344},{FDI_SSE_MOVLPS, 11, 4096, 49152},{FDI_SSE_MOVLPD, 11, 4096, 49152},{FDI_SSE_UNPCKLPS, 14, 1034, 57344},{FDI_SSE_UNPCKLPD, 14, 1034, 57344},{FDI_SSE_UNPCKHPS, 14, 1034, 57344},{FDI_SSE_UNPCKHPD, 14, 1034, 57344},{FDI_SSE_MOVHPS, 14, 4104, 57344},{FDI_SSE_MOVLHPS, 14, 4104, 57344},{FDI_SSE_MOVHPD, 14, 29697, 49152},{FDI_SSE_MOVSHDUP, 14, 1034, 57344},{FDI_SSE_MOVHPS, 11, 4104, 57344},{FDI_SSE_MOVHPD, 11, 4104, 57344},{FDI_SSE_MOVAPS, 14, 1034, 57344},{FDI_SSE_MOVAPD, 14, 1034, 57344},{FDI_SSE_MOVAPS, 11, 1034, 57344},{FDI_SSE_MOVAPD, 11, 1034, 57344},{FDI_SSE_CVTSI2SS, 14, 3074, 49153},{FDI_SSE_CVTSI2SD, 14, 4098, 49153},{FDI_SSE_MOVNTPS, 11, 1034, 57344},{FDI_SSE_MOVNTPD, 11, 1034, 57344},{FDI_SSE_MOVNTSS, 11, 3072, 49152},{FDI_SSE_MOVNTSD, 11, 4096, 49152},{FDI_SSE_CVTTSS2SI, 14, 3080, 49160},{FDI_SSE_CVTTSD2SI, 14, 4104, 49160},{FDI_SSE_CVTSS2SI, 14, 3080, 49160},{FDI_SSE_CVTSD2SI, 14, 4104, 49160},{FDI_SSE_UCOMISS, 14, 3072, 49152},{FDI_SSE_UCOMISD, 14, 4096, 49152},{FDI_SSE_COMISS, 14, 3072, 49152},{FDI_SSE_COMISD, 14, 4096, 49152},{FDI_SSE_MOVMSKPS, 14, 5128, 53256},{FDI_SSE_MOVMSKPD, 14, 5128, 53256},{FDI_SSE_SQRTPS, 14, 1034, 57344},{FDI_SSE_SQRTPD, 14, 1034, 57344},{FDI_SSE_SQRTSS, 14, 3072, 49152},{FDI_SSE_SQRTSD, 14, 4096, 49152},{FDI_SSE_RSQRTPS, 14, 1034, 57344},{FDI_SSE_RSQRTSS, 14, 3072, 49152},{FDI_SSE_RCPPS, 14, 1034, 57344},{FDI_SSE_RCPSS, 14, 3072, 49152},{FDI_SSE_ANDPS, 14, 1034, 57344},{FDI_SSE_ANDPD, 14, 1034, 57344},{FDI_SSE_ANDNPS, 14, 1034, 57344},{FDI_SSE_ANDNPD, 14, 1034, 57344},{FDI_SSE_ORPS, 14, 1034, 57344},{FDI_SSE_ORPD, 14, 1034, 57344},{FDI_SSE_XORPS, 14, 1034, 57344},{FDI_SSE_XORPD, 14, 1034, 57344},{FDI_SSE_ADDPS, 14, 1034, 57344},{FDI_SSE_ADDPD, 14, 1034, 57344},{FDI_SSE_ADDSS, 14, 3072, 49152},{FDI_SSE_ADDSD, 14, 4096, 49152},{FDI_SSE_MULPS, 14, 1034, 57344},{FDI_SSE_MULPD, 14, 1034, 57344},{FDI_SSE_MULSS, 14, 3072, 49152},{FDI_SSE_MULSD, 14, 4096, 49152},{FDI_SSE_CVTPS2PD, 14, 4104, 57344},{FDI_SSE_CVTPD2PS, 14, 1034, 57344},{FDI_SSE_CVTSS2SD, 14, 27652, 49152},{FDI_SSE_CVTSD2SS, 14, 27649, 49152},{FDI_SSE_CVTDQ2PS, 14, 5128, 57344},{FDI_SSE_CVTPS2DQ, 14, 5122, 57344},{FDI_SSE_CVTTPS2DQ, 14, 5122, 57344},{FDI_SSE_SUBPS, 14, 1034, 57344},{FDI_SSE_SUBPD, 14, 1034, 57344},{FDI_SSE_SUBSS, 14, 3072, 49152},{FDI_SSE_SUBSD, 14, 4096, 49152},{FDI_SSE_MINPS, 14, 1034, 57344},{FDI_SSE_MINPD, 14, 1034, 57344},{FDI_SSE_MINSS, 14, 3072, 49152},{FDI_SSE_MINSD, 14, 4096, 49152},{FDI_SSE_DIVPS, 14, 1034, 57344},{FDI_SSE_DIVPD, 14, 1034, 57344},{FDI_SSE_DIVSS, 14, 3072, 49152},{FDI_SSE_DIVSD, 14, 4096, 49152},{FDI_SSE_MAXPS, 14, 1034, 57344},{FDI_SSE_MAXPD, 14, 1034, 57344},{FDI_SSE_MAXSS, 14, 3072, 49152},{FDI_SSE_MAXSD, 14, 4096, 49152},{FDI_SSE_PUNPCKLBW, 14, 1034, 57344},{FDI_SSE_PUNPCKLWD, 14, 1034, 57344},{FDI_SSE_PUNPCKLDQ, 14, 1034, 57344},{FDI_SSE_PACKSSWB, 14, 1034, 57344},{FDI_SSE_PCMPGTB, 14, 1034, 57344},{FDI_SSE_PCMPGTW, 14, 1034, 57344},{FDI_SSE_PCMPGTD, 14, 1034, 57344},{FDI_SSE_PACKUSWB, 14, 1034, 57344},{FDI_SSE_PUNPCKHBW, 14, 1034, 57344},{FDI_SSE_PUNPCKHWD, 14, 1034, 57344},{FDI_SSE_PUNPCKHDQ, 14, 1034, 57344},{FDI_SSE_PACKSSDW, 14, 1034, 57344},{FDI_SSE_PUNPCKLQDQ, 14, 1034, 57344},{FDI_SSE_PUNPCKHQDQ, 14, 1034, 57344},{FDI_SSE_MOVD, 14, 3080, 57345},{FDI_SSE_MOVQ, 14, 4104, 57345},{FDI_SSE_MOVDQA, 14, 1034, 57344},{FDI_SSE_MOVDQU, 14, 1034, 57344},{FDI_SSE_PSHUFD, 20558, 1098, 57344},{FDI_SSE_PSHUFHW, 20558, 1098, 57344},{FDI_SSE_PSHUFLW, 20558, 1098, 57344},{FDI_SSE_PSRLW, 20611, 1090, 57344},{FDI_SSE_PSRAW, 20611, 1090, 57344},{FDI_SSE_PSLLW, 20611, 1090, 57344},{FDI_SSE_PSRLD, 20611, 1090, 57344},{FDI_SSE_PSRAD, 20611, 1090, 57344},{FDI_SSE_PSLLD, 20611, 1090, 57344},{FDI_SSE_PSRLQ, 20611, 1090, 57344},{FDI_SSE_PSRLDQ, 20611, 1090, 57344},{FDI_SSE_PSLLQ, 20611, 1090, 57344},{FDI_SSE_PSLLDQ, 20611, 1090, 57344},{FDI_SSE_PCMPEQB, 14, 1034, 57344},{FDI_SSE_PCMPEQW, 14, 1034, 57344},{FDI_SSE_PCMPEQD, 14, 1034, 57344},{FDI_SSE_EXTRQ, 16515, 2050, 57344},{FDI_SSE_INSERTQ, 16462, 2058, 57344},{FDI_SSE_EXTRQ, 14, 1034, 57344},{FDI_SSE_INSERTQ, 14, 1034, 57344},{FDI_SSE_HADDPD, 14, 1034, 57344},{FDI_SSE_HADDPS, 14, 1034, 57344},{FDI_SSE_HSUBPD, 14, 1034, 57344},{FDI_SSE_HSUBPS, 14, 1034, 57344},{FDI_SSE_MOVD, 11, 1034, 49153},{FDI_SSE_MOVQ, 11, 1034, 49153},{FDI_SSE_MOVQ, 14, 4104, 57344},{FDI_SSE_MOVDQA, 11, 1034, 57344},{FDI_SSE_MOVDQU, 11, 1034, 57344},{FDI_FXSAVE, 3, 33024, 49152},{FDI_FXRSTOR, 3, 33024, 49152},{FDI_LDMXCSR, 3, 3072, 49152},{FDI_STMXCSR, 3, 3072, 49152},{FDI_LFENCE, 0, 1024, 49152},{FDI_MFENCE, 0, 1024, 49152},{FDI_SFENCE, 0, 1024, 49152},{FDI_SSE_CMPPS, 20558, 1098, 57344},{FDI_SSE_CMPPD, 20558, 1098, 57344},{FDI_SSE_CMPSS, 20558, 3136, 49152},{FDI_SSE_CMPSD, 20558, 4160, 49152},{FDI_SSE_PINSRW, 20558, 2120, 57345},{FDI_SSE_PEXTRW, 20558, 5192, 53256},{FDI_SSE_SHUFPS, 20558, 1098, 57344},{FDI_SSE_SHUFPD, 20558, 1098, 57344},{FDI_SSE_ADDSUBPD, 14, 1034, 57344},{FDI_SSE_ADDSUBPS, 14, 1034, 57344},{FDI_SSE_PSRLW, 14, 1034, 57344},{FDI_SSE_PSRLD, 14, 1034, 57344},{FDI_SSE_PSRLQ, 14, 1034, 57344},{FDI_SSE_PADDQ, 14, 1034, 57344},{FDI_SSE_PMULLW, 14, 1034, 57344},{FDI_SSE_MOVQ, 11, 4096, 49152},{FDI_SSE_PMOVMSKB, 14, 5128, 53256},{FDI_SSE_PSUBUSB, 14, 1034, 57344},{FDI_SSE_PSUBUSW, 14, 1034, 57344},{FDI_SSE_PMINUB, 14, 1034, 57344},{FDI_SSE_PAND, 14, 1034, 57344},{FDI_SSE_PADDUSB, 14, 1034, 57344},{FDI_SSE_PADDUSW, 14, 1034, 57344},{FDI_SSE_PMAXUB, 14, 1034, 57344},{FDI_SSE_PANDN, 14, 1034, 57344},{FDI_SSE_PAVGB, 14, 1034, 57344},{FDI_SSE_PSRAW, 14, 1034, 57344},{FDI_SSE_PSRAD, 14, 1034, 57344},{FDI_SSE_PAVGW, 14, 1034, 57344},{FDI_SSE_PMULHUW, 14, 1034, 57344},{FDI_SSE_PMULHW, 14, 1034, 57344},{FDI_SSE_CVTTPD2DQ, 14, 1034, 57344},{FDI_SSE_CVTDQ2PD, 14, 4104, 57344},{FDI_SSE_CVTPD2DQ, 14, 1034, 57344},{FDI_SSE_MOVNTDQ, 11, 1034, 57344},{FDI_SSE_PSUBSB, 14, 1034, 57344},{FDI_SSE_PSUBSW, 14, 1034, 57344},{FDI_SSE_POR, 14, 1034, 57344},{FDI_SSE_PADDSB, 14, 1034, 57344},{FDI_SSE_PMINSW, 14, 1034, 57344},{FDI_SSE_PMAXSW, 14, 1034, 57344},{FDI_SSE_PADDSW, 14, 1034, 57344},{FDI_SSE_PXOR, 14, 1034, 57344},{FDI_SSE_LDDQU, 14, 1034, 57344},{FDI_SSE_PSLLW, 14, 1034, 57344},{FDI_SSE_PSLLD, 14, 1034, 57344},{FDI_SSE_PSLLQ, 14, 1034, 57344},{FDI_SSE_PMULUDQ, 14, 1034, 57344},{FDI_SSE_PMADDWD, 14, 1034, 57344},{FDI_SSE_PSADBW, 14, 1034, 57344},{FDI_SSE_MASKMOVDQU, 14, 1034, 57344},{FDI_SSE_PSUBB, 14, 1034, 57344},{FDI_SSE_PSUBW, 14, 1034, 57344},{FDI_SSE_PSUBD, 14, 1034, 57344},{FDI_SSE_PSUBQ, 14, 1034, 57344},{FDI_SSE_PADDB, 14, 1034, 57344},{FDI_SSE_PADDW, 14, 1034, 57344},{FDI_SSE_PADDD, 14, 1034, 57344},{FDI_SSE_PSHUFB, 14, 1034, 57344},{FDI_SSE_PHADDW, 14, 1034, 57344},{FDI_SSE_PHADDD, 14, 1034, 57344},{FDI_SSE_PHADDSW, 14, 1034, 57344},{FDI_SSE_PMADDUBSW, 14, 1034, 57344},{FDI_SSE_PHSUBW, 14, 1034, 57344},{FDI_SSE_PHSUBD, 14, 1034, 57344},{FDI_SSE_PHSUBSW, 14, 1034, 57344},{FDI_SSE_PSIGNB, 14, 1034, 57344},{FDI_SSE_PSIGNW, 14, 1034, 57344},{FDI_SSE_PSIGND, 14, 1034, 57344},{FDI_SSE_PMULHRSW, 14, 1034, 57344},{FDI_SSE_PBLENDVB, 14, 5120, 49152},{FDI_SSE_BLENDVPS, 30, 5120, 49152},{FDI_SSE_BLENDVPD, 30, 5120, 49152},{FDI_SSE_PTEST, 14, 1034, 57344},{FDI_SSE_PABSB, 14, 1034, 57344},{FDI_SSE_PABSW, 14, 1034, 57344},{FDI_SSE_PABSD, 14, 1034, 57344},{FDI_SSE_PMOVSXBW, 14, 1035, 59392},{FDI_SSE_PMOVSXBD, 14, 1035, 61440},{FDI_SSE_PMOVSXBQ, 14, 1035, 63488},{FDI_SSE_PMOVSXWD, 14, 1035, 59392},{FDI_SSE_PMOVSXWQ, 14, 1035, 61440},{FDI_SSE_PMOVSXDQ, 14, 1035, 59392},{FDI_SSE_PMULDQ, 14, 1034, 57344},{FDI_SSE_PCMPEQQ, 14, 1034, 57344},{FDI_SSE_MOVNTDQA, 14, 1034, 57344},{FDI_SSE_PACKUSDW, 14, 1034, 57344},{FDI_SSE_PMOVZXBW, 14, 1035, 59392},{FDI_SSE_PMOVZXBD, 14, 1035, 61440},{FDI_SSE_PMOVZXBQ, 14, 1035, 63488},{FDI_SSE_PMOVZXWD, 14, 1035, 59392},{FDI_SSE_PMOVZXWQ, 14, 1035, 61440},{FDI_SSE_PMOVZXDQ, 14, 1035, 59392},{FDI_SSE_PCMPGTQ, 14, 1034, 57344},{FDI_SSE_PMINSB, 14, 1034, 57344},{FDI_SSE_PMINSD, 14, 1034, 57344},{FDI_SSE_PMINUW, 14, 1034, 57344},{FDI_SSE_PMINUD, 14, 1034, 57344},{FDI_SSE_PMAXSB, 14, 1034, 57344},{FDI_SSE_PMAXSD, 14, 1034, 57344},{FDI_SSE_PMAXUW, 14, 1034, 57344},{FDI_SSE_PMAXUD, 14, 1034, 57344},{FDI_SSE_PMULLD, 14, 1034, 57344},{FDI_SSE_PHMINPOSUW, 14, 1034, 57344},{FDI_MOVDIR64B, 14, 7176, 53256},{FDI_MOVDIRI, 11, 1034, 49160},{FDI_SSE_ROUNDPS, 20558, 1098, 57344},{FDI_SSE_ROUNDPD, 20558, 1098, 57344},{FDI_SSE_ROUNDSS, 20558, 3136, 49152},{FDI_SSE_ROUNDSD, 20558, 4160, 49152},{FDI_SSE_BLENDPS, 20558, 1098, 57344},{FDI_SSE_BLENDPD, 20558, 1098, 57344},{FDI_SSE_PBLENDW, 20558, 1098, 57344},{FDI_SSE_PALIGNR, 20558, 1098, 57344},{FDI_SSE_PEXTRB, 20555, 1096, 57344},{FDI_SSE_PEXTRB, 20555, 3144, 57345},{FDI_SSE_PEXTRW, 20555, 2120, 57344},{FDI_SSE_PEXTRW, 20555, 3144, 57345},{FDI_SSE_PEXTRD, 20555, 3144, 57345},{FDI_SSE_PEXTRQ, 20555, 4168, 57345},{FDI_SSE_EXTRACTPS, 20555, 3144, 57345},{FDI_SSE_PINSRB, 20558, 1096, 57345},{FDI_SSE_INSERTPS, 20558, 3144, 57344},{FDI_SSE_PINSRD, 20558, 3144, 57345},{FDI_SSE_PINSRQ, 20558, 4168, 57345},{FDI_SSE_DPPS, 20558, 1098, 57344},{FDI_SSE_DPPD, 20558, 1098, 57344},{FDI_SSE_MPSADBW, 20558, 1098, 57344},{FDI_SSE_PCLMULQDQ, 20558, 5184, 49152},{FDI_SSE_PCMPESTRM, 20558, 5184, 49152},{FDI_SSE_PCMPESTRI, 20558, 5184, 49152},{FDI_SSE_PCMPISTRM, 20558, 5184, 49152},{FDI_SSE_PCMPISTRI, 20558, 5184, 49152},{FDI_AESIMC, 14, 5120, 49152},{FDI_AESENC, 14, 5120, 49152},{FDI_AESENCLAST, 14, 5120, 49152},{FDI_AESDEC, 14, 5120, 49152},{FDI_AESDECLAST, 14, 5120, 49152},{FDI_AESKEYGENASSIST, 20558, 5184, 49152},{FDI_VAESIMC, 14, 5120, 49152},{FDI_VAESENC, 45, 1066, 57344},{FDI_VAESENCLAST, 45, 1066, 57344},{FDI_VAESDEC, 45, 1066, 57344},{FDI_VAESDECLAST, 45, 1066, 57344},{FDI_VAESKEYGENASSIST, 20558, 5184, 49152},{FDI_VMOVUPS, 14, 1034, 57344},{FDI_VMOVUPD, 14, 1034, 57344},{FDI_VMOVSS, 14, 21505, 49152},{FDI_VMOVSS, 45, 21505, 49152},{FDI_VMOVSD, 14, 29697, 49152},{FDI_VMOVSD, 45, 29697, 49152},{FDI_VMOVUPS, 11, 1034, 57344},{FDI_VMOVUPD, 11, 1034, 57344},{FDI_VMOVSS, 11, 3072, 49152},{FDI_VMOVSS, 39, 21508, 49152},{FDI_VMOVSD, 11, 4096, 49152},{FDI_VMOVSD, 39, 29700, 49152},{FDI_VMOVLPS, 45, 29697, 49152},{FDI_VMOVHLPS, 45, 5120, 49152},{FDI_VMOVLPD, 45, 29697, 49152},{FDI_VMOVDDUP, 14, 4104, 57344},{FDI_VMOVDDUP, 14, 1034, 57344},{FDI_VMOVSLDUP, 14, 1034, 57344},{FDI_VMOVLPS, 11, 4096, 49152},{FDI_VMOVLPD, 11, 4096, 49152},{FDI_VUNPCKLPS, 45, 1066, 57344},{FDI_VUNPCKLPD, 45, 1066, 57344},{FDI_VUNPCKHPS, 45, 1066, 57344},{FDI_VUNPCKHPD, 45, 1066, 57344},{FDI_VMOVHPS, 45, 29713, 49152},{FDI_VMOVLHPS, 45, 29713, 49152},{FDI_VMOVHPD, 45, 29713, 49152},{FDI_VMOVSHDUP, 14, 1034, 57344},{FDI_VMOVHPS, 11, 4096, 49152},{FDI_VMOVHPD, 11, 4096, 49152},{FDI_VMOVAPS, 14, 1034, 57344},{FDI_VMOVAPD, 14, 1034, 57344},{FDI_VMOVAPS, 11, 1034, 57344},{FDI_VMOVAPD, 11, 1034, 57344},{FDI_VCVTSI2SS, 45, 5122, 49153},{FDI_VCVTSI2SD, 45, 5122, 49153},{FDI_VMOVNTPS, 11, 1034, 57344},{FDI_VMOVNTPD, 11, 1034, 57344},{FDI_VCVTTSS2SI, 14, 3080, 49160},{FDI_VCVTTSD2SI, 14, 4104, 49160},{FDI_VCVTSS2SI, 14, 3080, 49160},{FDI_VCVTSD2SI, 14, 4104, 49160},{FDI_VUCOMISS, 14, 3072, 49152},{FDI_VUCOMISD, 14, 4096, 49152},{FDI_VCOMISS, 14, 3072, 49152},{FDI_VCOMISD, 14, 4096, 49152},{FDI_VMOVMSKPS, 14, 3074, 57352},{FDI_VMOVMSKPD, 14, 3074, 57352},{FDI_VSQRTPS, 14, 1034, 57344},{FDI_VSQRTPD, 14, 1034, 57344},{FDI_VSQRTSS, 45, 21505, 49152},{FDI_VSQRTSD, 45, 29697, 49152},{FDI_VRSQRTPS, 14, 1034, 57344},{FDI_VRSQRTSS, 45, 21505, 49152},{FDI_VRCPPS, 14, 1034, 57344},{FDI_VRCPSS, 45, 21505, 49152},{FDI_VANDPS, 45, 1066, 57344},{FDI_VANDPD, 45, 1066, 57344},{FDI_VANDNPS, 45, 1066, 57344},{FDI_VANDNPD, 45, 1066, 57344},{FDI_VORPS, 45, 1066, 57344},{FDI_VORPD, 45, 1066, 57344},{FDI_VXORPS, 45, 1066, 57344},{FDI_VXORPD, 45, 1066, 57344},{FDI_VADDPS, 45, 1066, 57344},{FDI_VADDPD, 45, 1066, 57344},{FDI_VADDSS, 45, 21505, 49152},{FDI_VADDSD, 45, 29697, 49152},{FDI_VMULPS, 45, 1066, 57344},{FDI_VMULPD, 45, 1066, 57344},{FDI_VMULSS, 45, 21505, 49152},{FDI_VMULSD, 45, 29697, 49152},{FDI_VCVTPS2PD, 14, 1035, 59392},{FDI_VCVTPD2PS, 14, 1038, 59392},{FDI_VCVTSS2SD, 45, 21505, 49152},{FDI_VCVTSD2SS, 45, 29697, 49152},{FDI_VCVTDQ2PS, 14, 1034, 57344},{FDI_VCVTPS2DQ, 14, 1034, 57344},{FDI_VCVTTPS2DQ, 14, 1034, 57344},{FDI_VSUBPS, 45, 1066, 57344},{FDI_VSUBPD, 45, 1066, 57344},{FDI_VSUBSS, 45, 21505, 49152},{FDI_VSUBSD, 45, 29697, 49152},{FDI_VMINPS, 45, 1066, 57344},{FDI_VMINPD, 45, 1066, 57344},{FDI_VMINSS, 45, 21505, 49152},{FDI_VMINSD, 45, 29697, 49152},{FDI_VDIVPS, 45, 1066, 57344},{FDI_VDIVPD, 45, 1066, 57344},{FDI_VDIVSS, 45, 21505, 49152},{FDI_VDIVSD, 45, 29697, 49152},{FDI_VMAXPS, 45, 1066, 57344},{FDI_VMAXPD, 45, 1066, 57344},{FDI_VMAXSS, 45, 21505, 49152},{FDI_VMAXSD, 45, 29697, 49152},{FDI_VPUNPCKLBW, 45, 1066, 57344},{FDI_VPUNPCKLWD, 45, 1066, 57344},{FDI_VPUNPCKLDQ, 45, 1066, 57344},{FDI_VPACKSSWB, 45, 1066, 57344},{FDI_VPCMPGTB, 45, 1066, 57344},{FDI_VPCMPGTW, 45, 1066, 57344},{FDI_VPCMPGTD, 45, 1066, 57344},{FDI_VPACKUSWB, 45, 1066, 57344},{FDI_VPUNPCKHBW, 45, 1066, 57344},{FDI_VPUNPCKHWD, 45, 1066, 57344},{FDI_VPUNPCKHDQ, 45, 1066, 57344},{FDI_VPACKSSDW, 45, 1066, 57344},{FDI_VPUNPCKLQDQ, 45, 1066, 57344},{FDI_VPUNPCKHQDQ, 45, 1066, 57344},{FDI_VMOVD, 14, 1034, 49153},{FDI_VMOVQ, 14, 1034, 49153},{FDI_VMOVDQA, 14, 1034, 57344},{FDI_VMOVDQU, 14, 1034, 57344},{FDI_VPSHUFD, 20558, 1098, 57344},{FDI_VPSHUFHW, 20558, 1098, 57344},{FDI_VPSHUFLW, 20558, 1098, 57344},{FDI_VPSRLW, 20594, 1122, 57344},{FDI_VPSRAW, 20594, 1122, 57344},{FDI_VPSLLW, 20594, 1122, 57344},{FDI_VPSRLD, 20594, 1122, 57344},{FDI_VPSRAD, 20594, 1122, 57344},{FDI_VPSLLD, 20594, 1122, 57344},{FDI_VPSRLQ, 20594, 1122, 57344},{FDI_VPSRLDQ, 20594, 1122, 57344},{FDI_VPSLLQ, 20594, 1122, 57344},{FDI_VPSLLDQ, 20594, 1122, 57344},{FDI_VPCMPEQB, 45, 1066, 57344},{FDI_VPCMPEQW, 45, 1066, 57344},{FDI_VPCMPEQD, 45, 1066, 57344},{FDI_VZEROUPPER, 0, 1024, 32768},{FDI_VZEROALL, 0, 1024, 32768},{FDI_VHADDPD, 45, 1066, 57344},{FDI_VHADDPS, 45, 1066, 57344},{FDI_VHSUBPD, 45, 1066, 57344},{FDI_VHSUBPS, 45, 1066, 57344},{FDI_VMOVD, 11, 1034, 49153},{FDI_VMOVQ, 11, 1034, 49153},{FDI_VMOVQ, 14, 4096, 49152},{FDI_VMOVDQA, 11, 1034, 57344},{FDI_VMOVDQU, 11, 1034, 57344},{FDI_VLDMXCSR, 3, 3072, 49152},{FDI_VSTMXCSR, 3, 3072, 49152},{FDI_VCMPPS, 20525, 1130, 57344},{FDI_VCMPPD, 20525, 1130, 57344},{FDI_VCMPSS, 20525, 21569, 49152},{FDI_VCMPSD, 20525, 29761, 49152},{FDI_VPINSRW, 20525, 13377, 49153},{FDI_VPEXTRW, 20558, 21572, 49160},{FDI_VSHUFPS, 20525, 1130, 57344},{FDI_VSHUFPD, 20525, 1130, 57344},{FDI_VADDSUBPD, 45, 1066, 57344},{FDI_VADDSUBPS, 45, 1066, 57344},{FDI_VPSRLW, 45, 5160, 57344},{FDI_VPSRLD, 45, 5160, 57344},{FDI_VPSRLQ, 45, 5160, 57344},{FDI_VPADDQ, 45, 1066, 57344},{FDI_VPMULLW, 45, 1066, 57344},{FDI_VMOVQ, 11, 4096, 49152},{FDI_VPMOVMSKB, 14, 3074, 57352},{FDI_VPSUBUSB, 45, 1066, 57344},{FDI_VPSUBUSW, 45, 1066, 57344},{FDI_VPMINUB, 45, 1066, 57344},{FDI_VPAND, 45, 1066, 57344},{FDI_VPADDUSB, 45, 1066, 57344},{FDI_VPADDUSW, 45, 1066, 57344},{FDI_VPMAXUB, 45, 1066, 57344},{FDI_VPANDN, 45, 1066, 57344},{FDI_VPAVGB, 45, 1066, 57344},{FDI_VPSRAW, 45, 5160, 57344},{FDI_VPSRAD, 45, 5160, 57344},{FDI_VPAVGW, 45, 1066, 57344},{FDI_VPMULHUW, 45, 1066, 57344},{FDI_VPMULHW, 45, 1066, 57344},{FDI_VCVTTPD2DQ, 14, 1038, 59392},{FDI_VCVTDQ2PD, 14, 1035, 59392},{FDI_VCVTPD2DQ, 14, 1038, 59392},{FDI_VMOVNTDQ, 11, 1034, 57344},{FDI_VPSUBSB, 45, 1066, 57344},{FDI_VPSUBSW, 45, 1066, 57344},{FDI_VPOR, 45, 1066, 57344},{FDI_VPADDSB, 45, 1066, 57344},{FDI_VPMINSW, 45, 1066, 57344},{FDI_VPADDSW, 45, 1066, 57344},{FDI_VPMAXSW, 45, 1066, 57344},{FDI_VPXOR, 45, 1066, 57344},{FDI_VLDDQU, 14, 1034, 57344},{FDI_VPSLLW, 45, 5160, 57344},{FDI_VPSLLD, 45, 5160, 57344},{FDI_VPSLLQ, 45, 5160, 57344},{FDI_VPMULUDQ, 45, 1066, 57344},{FDI_VPMADDWD, 45, 1066, 57344},{FDI_VPSADBW, 45, 1066, 57344},{FDI_VMASKMOVDQU, 14, 1034, 57344},{FDI_VPSUBB, 45, 1066, 57344},{FDI_VPSUBW, 45, 1066, 57344},{FDI_VPSUBD, 45, 1066, 57344},{FDI_VPSUBQ, 45, 1066, 57344},{FDI_VPADDB, 45, 1066, 57344},{FDI_VPADDW, 45, 1066, 57344},{FDI_VPADDD, 45, 1066, 57344},{FDI_VPSHUFB, 45, 1066, 57344},{FDI_VPHADDW, 45, 1066, 57344},{FDI_VPHADDD, 45, 1066, 57344},{FDI_VPHADDSW, 45, 1066, 57344},{FDI_VPMADDUBSW, 45, 1066, 57344},{FDI_VPHSUBW, 45, 1066, 57344},{FDI_VPHSUBD, 45, 1066, 57344},{FDI_VPHSUBSW, 45, 1066, 57344},{FDI_VPSIGNB, 45, 1066, 57344},{FDI_VPSIGNW, 45, 1066, 57344},{FDI_VPSIGND, 45, 1066, 57344},{FDI_VPMULHRSW, 45, 1066, 57344},{FDI_VPERMILPS, 45, 1066, 57344},{FDI_VPERMILPD, 45, 1066, 57344},{FDI_VTESTPS, 14, 1034, 57344},{FDI_VTESTPD, 14, 1034, 57344},{FDI_VCVTPH2PS, 14, 1035, 59392},{FDI_VPERMPS, 45, 1066, 57344},{FDI_VPTEST, 14, 1034, 57344},{FDI_VBROADCASTSS, 14, 3080, 57344},{FDI_VBROADCASTSD, 14, 4104, 57344},{FDI_VBROADCASTF128, 14, 5128, 57344},{FDI_VPABSB, 14, 1034, 57344},{FDI_VPABSW, 14, 1034, 57344},{FDI_VPABSD, 14, 1034, 57344},{FDI_VPMOVSXBW, 14, 1035, 59392},{FDI_VPMOVSXBD, 14, 1035, 61440},{FDI_VPMOVSXBQ, 14, 1035, 63488},{FDI_VPMOVSXWD, 14, 1035, 59392},{FDI_VPMOVSXWQ, 14, 1035, 61440},{FDI_VPMOVSXDQ, 14, 1035, 59392},{FDI_VPMULDQ, 45, 1066, 57344},{FDI_VPCMPEQQ, 45, 1066, 57344},{FDI_VMOVNTDQA, 14, 1034, 57344},{FDI_VPACKUSDW, 45, 1066, 57344},{FDI_VMASKMOVPS, 45, 1066, 57344},{FDI_VMASKMOVPD, 45, 1066, 57344},{FDI_VMASKMOVPS, 39, 1066, 57344},{FDI_VMASKMOVPD, 39, 1066, 57344},{FDI_VPMOVZXBW, 14, 1035, 59392},{FDI_VPMOVZXBD, 14, 1035, 61440},{FDI_VPMOVZXBQ, 14, 1035, 63488},{FDI_VPMOVZXWD, 14, 1035, 59392},{FDI_VPMOVZXWQ, 14, 1035, 61440},{FDI_VPMOVZXDQ, 14, 1035, 59392},{FDI_VPERMD, 45, 1066, 57344},{FDI_VPCMPGTQ, 45, 1066, 57344},{FDI_VPMINSB, 45, 1066, 57344},{FDI_VPMINSD, 45, 1066, 57344},{FDI_VPMINUW, 45, 1066, 57344},{FDI_VPMINUD, 45, 1066, 57344},{FDI_VPMAXSB, 45, 1066, 57344},{FDI_VPMAXSD, 45, 1066, 57344},{FDI_VPMAXUW, 45, 1066, 57344},{FDI_VPMAXUD, 45, 1066, 57344},{FDI_VPMULLD, 45, 1066, 57344},{FDI_VPHMINPOSUW, 14, 1034, 57344},{FDI_VPSRLVD, 45, 1066, 57344},{FDI_VPSRLVQ, 45, 1066, 57344},{FDI_VPSRAVD, 45, 1066, 57344},{FDI_VPSLLVD, 45, 1066, 57344},{FDI_VPSLLVQ, 45, 1066, 57344},{FDI_VPBROADCASTD, 14, 3080, 57344},{FDI_VPBROADCASTQ, 14, 4104, 57344},{FDI_VBROADCASTI128, 14, 5128, 57344},{FDI_VPBROADCASTB, 14, 1032, 57344},{FDI_VPBROADCASTW, 14, 2056, 57344},{FDI_VPMASKMOVD, 45, 1066, 57344},{FDI_VPMASKMOVQ, 45, 1066, 57344},{FDI_VPMASKMOVD, 39, 1066, 57344},{FDI_VPMASKMOVQ, 39, 1066, 57344},{FDI_VPGATHERDD, 32798, 3112, 57344},{FDI_VPGATHERDQ, 32798, 4136, 57344},{FDI_VPGATHERQD, 32798, 3132, 59392},{FDI_VPGATHERQQ, 32798, 4136, 57344},{FDI_VGATHERDPS, 32798, 3112, 57344},{FDI_VGATHERDPD, 32798, 4136, 57344},{FDI_VGATHERQPS, 32798, 3132, 59392},{FDI_VGATHERQPD, 32798, 4136, 57344},{FDI_VFMADDSUB132PS, 45, 1066, 57344},{FDI_VFMADDSUB132PD, 45, 1066, 57344},{FDI_VFMSUBADD132PS, 45, 1066, 57344},{FDI_VFMSUBADD132PD, 45, 1066, 57344},{FDI_VFMADD132PS, 45, 1066, 57344},{FDI_VFMADD132PD, 45, 1066, 57344},{FDI_VFMADD132SS, 45, 21505, 49152},{FDI_VFMADD132SD, 45, 29697, 49152},{FDI_VFMSUB132PS, 45, 1066, 57344},{FDI_VFMSUB132PD, 45, 1066, 57344},{FDI_VFMSUB132SS, 45, 21505, 49152},{FDI_VFMSUB132SD, 45, 29697, 49152},{FDI_VFNMADD132PS, 45, 1066, 57344},{FDI_VFNMADD132PD, 45, 1066, 57344},{FDI_VFNMADD132SS, 45, 21505, 49152},{FDI_VFNMADD132SD, 45, 29697, 49152},{FDI_VFNMSUB132PS, 45, 1066, 57344},{FDI_VFNMSUB132PD, 45, 1066, 57344},{FDI_VFNMSUB132SS, 45, 21505, 49152},{FDI_VFNMSUB132SD, 45, 29697, 49152},{FDI_VFMADDSUB213PS, 45, 1066, 57344},{FDI_VFMADDSUB213PD, 45, 1066, 57344},{FDI_VFMSUBADD213PS, 45, 1066, 57344},{FDI_VFMSUBADD213PD, 45, 1066, 57344},{FDI_VFMADD213PS, 45, 1066, 57344},{FDI_VFMADD213PD, 45, 1066, 57344},{FDI_VFMADD213SS, 45, 21505, 49152},{FDI_VFMADD213SD, 45, 29697, 49152},{FDI_VFMSUB213PS, 45, 1066, 57344},{FDI_VFMSUB213PD, 45, 1066, 57344},{FDI_VFMSUB213SS, 45, 21505, 49152},{FDI_VFMSUB213SD, 45, 29697, 49152},{FDI_VFNMADD213PS, 45, 1066, 57344},{FDI_VFNMADD213PD, 45, 1066, 57344},{FDI_VFNMADD213SS, 45, 21505, 49152},{FDI_VFNMADD213SD, 45, 29697, 49152},{FDI_VFNMSUB213PS, 45, 1066, 57344},{FDI_VFNMSUB213PD, 45, 1066, 57344},{FDI_VFNMSUB213SS, 45, 21505, 49152},{FDI_VFNMSUB213SD, 45, 29697, 49152},{FDI_VFMADDSUB231PS, 45, 1066, 57344},{FDI_VFMADDSUB231PD, 45, 1066, 57344},{FDI_VFMSUBADD231PS, 45, 1066, 57344},{FDI_VFMSUBADD231PD, 45, 1066, 57344},{FDI_VFMADD231PS, 45, 1066, 57344},{FDI_VFMADD231PD, 45, 1066, 57344},{FDI_VFMADD231SS, 45, 21505, 49152},{FDI_VFMADD231SD, 45, 29697, 49152},{FDI_VFMSUB231PS, 45, 1066, 57344},{FDI_VFMSUB231PD, 45, 1066, 57344},{FDI_VFMSUB231SS, 45, 21505, 49152},{FDI_VFMSUB231SD, 45, 29697, 49152},{FDI_VFNMADD231PS, 45, 1066, 57344},{FDI_VFNMADD231PD, 45, 1066, 57344},{FDI_VFNMADD231SS, 45, 21505, 49152},{FDI_VFNMADD231SD, 45, 29697, 49152},{FDI_VFNMSUB231PS, 45, 1066, 57344},{FDI_VFNMSUB231PD, 45, 1066, 57344},{FDI_VFNMSUB231SS, 45, 21505, 49152},{FDI_VFNMSUB231SD, 45, 29697, 49152},{FDI_VPERMQ, 20558, 1098, 57344},{FDI_VPERMPD, 20558, 1098, 57344},{FDI_VPBLENDD, 20525, 1130, 57344},{FDI_VPERMILPS, 20558, 1098, 57344},{FDI_VPERMILPD, 20558, 1098, 57344},{FDI_VPERM2F128, 20525, 1130, 57344},{FDI_VROUNDPS, 20558, 1098, 57344},{FDI_VROUNDPD, 20558, 1098, 57344},{FDI_VROUNDSS, 20525, 21569, 49152},{FDI_VROUNDSD, 20525, 29761, 49152},{FDI_VBLENDPS, 20525, 1130, 57344},{FDI_VBLENDPD, 20525, 1130, 57344},{FDI_VPBLENDW, 20525, 1130, 57344},{FDI_VPALIGNR, 20525, 1130, 57344},{FDI_VPEXTRB, 20555, 5185, 49152},{FDI_VPEXTRB, 20555, 21569, 49153},{FDI_VPEXTRW, 20555, 13377, 49152},{FDI_VPEXTRW, 20555, 21569, 49153},{FDI_VPEXTRD, 20555, 5186, 49153},{FDI_VPEXTRQ, 20555, 5186, 49153},{FDI_VEXTRACTPS, 20555, 21569, 49153},{FDI_VINSERTF128, 20525, 5224, 57344},{FDI_VEXTRACTF128, 20555, 5192, 57344},{FDI_VCVTPS2PH, 20555, 1099, 59392},{FDI_VPINSRB, 20525, 5185, 49153},{FDI_VINSERTPS, 20525, 21569, 49152},{FDI_VPINSRD, 20525, 5186, 49153},{FDI_VPINSRQ, 20525, 5186, 49153},{FDI_VINSERTI128, 20525, 5224, 57344},{FDI_VEXTRACTI128, 20555, 5192, 57344},{FDI_VDPPS, 20525, 1130, 57344},{FDI_VDPPD, 20525, 1130, 57344},{FDI_VMPSADBW, 20525, 1130, 57344},{FDI_VPCLMULQDQ, 20525, 1130, 57344},{FDI_VPERM2I128, 20525, 1130, 57344},{FDI_VBLENDVPS, 12333, 1194, 57344},{FDI_VBLENDVPD, 12333, 1194, 57344},{FDI_VPBLENDVB, 12333, 1194, 57344},{FDI_VPCMPESTRM, 20558, 1098, 57344},{FDI_VPCMPESTRI, 20558, 1098, 57344},{FDI_VPCMPISTRM, 20558, 1098, 57344},{FDI_VPCMPISTRI, 20558, 1098, 57344},{FDI_ANDN, 45, 1066, 49225},{FDI_BLSR, 50, 1058, 49217},{FDI_BLSMSK, 50, 1058, 49217},{FDI_BLSI, 50, 1058, 49217},{FDI_BEXTR, 30, 1066, 49225},{FDI_RORX, 20558, 1098, 49161},{FDI_BZHI, 30, 1066, 49225},{FDI_PDEP, 45, 1066, 49225},{FDI_PEXT, 45, 1066, 49225},{FDI_MULX, 45, 1066, 49225},{FDI_SHLX, 30, 1066, 49225},{FDI_SHRX, 30, 1066, 49225},{FDI_SARX, 30, 1066, 49225},{FDI_ADCX, 14, 1034, 49161},{FDI_ADOX, 14, 1034, 49161},{FDI_FADD, 3, 3072, 16384},{FDI_FMUL, 3, 3072, 16384},{FDI_FCOM, 3, 3072, 16384},{FDI_FCOMP, 3, 3072, 16384},{FDI_FSUB, 3, 3072, 16384},{FDI_FSUBR, 3, 3072, 16384},{FDI_FDIV, 3, 3072, 16384},{FDI_FDIVR, 3, 3072, 16384},{FDI_FADD, 50, 0, 16580},{FDI_FMUL, 50, 0, 16580},{FDI_FCOM, 50, 0, 16580},{FDI_FCOMP, 50, 0, 16580},{FDI_FSUB, 50, 0, 16580},{FDI_FSUBR, 50, 0, 16580},{FDI_FDIV, 50, 0, 16580},{FDI_FDIVR, 50, 0, 16580},{FDI_FLD, 3, 3072, 16384},{FDI_FST, 3, 3072, 16384},{FDI_FSTP, 3, 3072, 16384},{FDI_FLDENV, 3, 0, 16384},{FDI_FLDCW, 3, 2048, 16384},{FDI_FSTENV, 3, 0, 16384},{FDI_FSTCW, 3, 2048, 16384},{FDI_FLD, 3, 0, 16388},{FDI_FXCH, 3, 0, 16388},{FDI_FNOP, 0, 1024, 16384},{FDI_FCHS, 0, 1024, 16384},{FDI_FABS, 0, 1024, 16384},{FDI_FTST, 0, 1024, 16384},{FDI_FXAM, 0, 1024, 16384},{FDI_FLD1, 0, 1024, 16384},{FDI_FLDL2T, 0, 1024, 16384},{FDI_FLDL2E, 0, 1024, 16384},{FDI_FLDPI, 0, 1024, 16384},{FDI_FLDLG2, 0, 1024, 16384},{FDI_FLDLN2, 0, 1024, 16384},{FDI_FLDZ, 0, 1024, 16384},{FDI_F2XM1, 0, 1024, 16384},{FDI_FYL2X, 0, 1024, 16384},{FDI_FPTAN, 0, 1024, 16384},{FDI_FPATAN, 0, 1024, 16384},{FDI_FXTRACT, 0, 1024, 16384},{FDI_FPREM1, 0, 1024, 16384},{FDI_FDECSTP, 0, 1024, 16384},{FDI_FINCSTP, 0, 1024, 16384},{FDI_FPREM, 0, 1024, 16384},{FDI_FYL2XP1, 0, 1024, 16384},{FDI_FSQRT, 0, 1024, 16384},{FDI_FSINCOS, 0, 1024, 16384},{FDI_FRNDINT, 0, 1024, 16384},{FDI_FSCALE, 0, 1024, 16384},{FDI_FSIN, 0, 1024, 16384},{FDI_FCOS, 0, 1024, 16384},{FDI_FIADD, 3, 3072, 16384},{FDI_FIMUL, 3, 3072, 16384},{FDI_FICOM, 3, 3072, 16384},{FDI_FICOMP, 3, 3072, 16384},{FDI_FISUB, 3, 3072, 16384},{FDI_FISUBR, 3, 3072, 16384},{FDI_FIDIV, 3, 3072, 16384},{FDI_FIDIVR, 3, 3072, 16384},{FDI_FCMOVB, 3, 0, 16388},{FDI_FCMOVE, 3, 0, 16388},{FDI_FCMOVBE, 3, 0, 16388},{FDI_FCMOVU, 3, 0, 16388},{FDI_FUCOMPP, 0, 1024, 16384},{FDI_FILD, 3, 3072, 16384},{FDI_FISTTP, 3, 3072, 16384},{FDI_FIST, 3, 3072, 16384},{FDI_FISTP, 3, 3072, 16384},{FDI_FLD, 3, 0, 16384},{FDI_FSTP, 3, 0, 16384},{FDI_FCMOVNB, 3, 0, 16388},{FDI_FCMOVNE, 3, 0, 16388},{FDI_FCMOVNBE, 3, 0, 16388},{FDI_FCMOVNU, 3, 0, 16388},{FDI_FCLEX, 0, 1024, 16384},{FDI_FINIT, 0, 1024, 16384},{FDI_FUCOMI, 3, 0, 16388},{FDI_FCOMI, 3, 0, 16388},{FDI_FADD, 3, 4096, 16384},{FDI_FMUL, 3, 4096, 16384},{FDI_FCOM, 3, 4096, 16384},{FDI_FCOMP, 3, 4096, 16384},{FDI_FSUB, 3, 4096, 16384},{FDI_FSUBR, 3, 4096, 16384},{FDI_FDIV, 3, 4096, 16384},{FDI_FDIVR, 3, 4096, 16384},{FDI_FADD, 35, 0, 16580},{FDI_FMUL, 35, 0, 16580},{FDI_FSUBR, 35, 0, 16580},{FDI_FSUB, 35, 0, 16580},{FDI_FDIVR, 35, 0, 16580},{FDI_FDIV, 35, 0, 16580},{FDI_FLD, 3, 4096, 16384},{FDI_FISTTP, 3, 4096, 16384},{FDI_FST, 3, 4096, 16384},{FDI_FSTP, 3, 4096, 16384},{FDI_FRSTOR, 3, 0, 16384},{FDI_FSAVE, 3, 0, 16384},{FDI_FSTSW, 3, 2048, 16384},{FDI_FFREE, 3, 0, 16388},{FDI_FST, 3, 0, 16388},{FDI_FSTP, 3, 0, 16388},{FDI_FUCOM, 3, 0, 16388},{FDI_FUCOMP, 3, 0, 16388},{FDI_FIADD, 3, 2048, 16384},{FDI_FIMUL, 3, 2048, 16384},{FDI_FICOM, 3, 2048, 16384},{FDI_FICOMP, 3, 2048, 16384},{FDI_FISUB, 3, 2048, 16384},{FDI_FISUBR, 3, 2048, 16384},{FDI_FIDIV, 3, 2048, 16384},{FDI_FIDIVR, 3, 2048, 16384},{FDI_FADDP, 35, 0, 16580},{FDI_FMULP, 35, 0, 16580},{FDI_FCOMPP, 0, 1024, 16384},{FDI_FSUBRP, 35, 0, 16580},{FDI_FSUBP, 35, 0, 16580},{FDI_FDIVRP, 35, 0, 16580},{FDI_FDIVP, 35, 0, 16580},{FDI_FILD, 3, 2048, 16384},{FDI_FISTTP, 3, 2048, 16384},{FDI_FIST, 3, 2048, 16384},{FDI_FISTP, 3, 2048, 16384},{FDI_FBLD, 3, 0, 16384},{FDI_FILD, 3, 4096, 16384},{FDI_FBSTP, 3, 0, 16384},{FDI_FISTP, 3, 4096, 16384},{FDI_FSTSW, 48, 2048, 16448},{FDI_FUCOMIP, 50, 0, 16580},{FDI_FCOMIP, 50, 0, 16580},{FDI_RSTORSSP, 3, 4096, 49152},{FDI_SETSSBSY, 0, 1024, 49152},{FDI_SAVEPREVSSP, 0, 1024, 49152},{FDI_RDSSP, 3, 1026, 49153},{FDI_ENDBR64, 0, 1024, 49152},{FDI_ENDBR32, 0, 1024, 49152},{FDI_WRUSS, 11, 1034, 49160},{FDI_WRSS, 11, 1034, 49160},{FDI_CLRSSBSY, 3, 4096, 49152},{FDI_INCSSP, 3, 1026, 49153},{FDI_CLDEMOTE, 3, 1024, 49152},{FDI_REP_MONTMUL, 0, 1024, 49152},{FDI_REP_XSHA1, 0, 1024, 49152},{FDI_REP_XSHA256, 0, 1024, 49152},{FDI_XSTORE, 0, 1024, 16384},{FDI_REP_XSTORE, 0, 1024, 49152},{FDI_REP_XCRYPTECB, 0, 1024, 49152},{FDI_REP_XCRYPTCBC, 0, 1024, 49152},{FDI_REP_XCRYPTCTR, 0, 1024, 49152},{FDI_REP_XCRYPTCFB, 0, 1024, 49152},{FDI_REP_XCRYPTOFB, 0, 1024, 49152},{FDI_INVEPT, 14, 5128, 53256},{FDI_INVVPID, 14, 5128, 53256},{FDI_VMCALL, 0, 1024, 49152},{FDI_VMCLEAR, 3, 4096, 49152},{FDI_VMFUNC, 0, 1024, 49152},{FDI_VMLAUNCH, 0, 1024, 49152},{FDI_VMRESUME, 0, 1024, 49152},{FDI_VMPTRLD, 3, 4096, 49152},{FDI_VMPTRST, 3, 4096, 49152},{FDI_VMREAD, 11, 1034, 53257},{FDI_VMWRITE, 14, 1034, 53257},{FDI_VMXOFF, 0, 1024, 49152},{FDI_VMXON, 3, 4096, 49152},{FDI_TDCALL, 0, 1024, 49152},{FDI_SEAMRET, 0, 1024, 49152},{FDI_SEAMOPS, 0, 1024, 49152},{FDI_SEAMCALL, 0, 1024, 49152},{FDI_CLZERO, 48, 1056, 16448},{FDI_RDPRU, 0, 1024, 16384},{FDI_VMRUN, 0, 1024, 16384},{FDI_VMMCALL, 0, 1024, 16384},{FDI_VMGEXIT, 0, 1024, 49152},{FDI_VMLOAD, 0, 1024, 16384},{FDI_VMSAVE, 0, 1024, 16384},{FDI_STGI, 0, 1024, 16384},{FDI_CLGI, 0, 1024, 16384},{FDI_SKINIT, 0, 1024, 16384},{FDI_INVLPGA, 0, 1024, 16384},{FDI_MONITORX, 0, 1024, 49152},{FDI_MCOMMIT, 0, 1024, 49152},{FDI_MWAITX, 0, 1024, 49152},{FDI_INVLPGB, 0, 1024, 49152},{FDI_TLBSYNC, 0, 1024, 49152},{FDI_RMPQUERY, 0, 1024, 49152},{FDI_RMPREAD, 0, 1024, 49152},{FDI_RMPADJUST, 0, 1024, 49152},{FDI_RMPUPDATE, 0, 1024, 49152},{FDI_PSMASH, 0, 1024, 49152},{FDI_PVALIDATE, 0, 1024, 49152},{FDI_TPAUSE, 3, 3072, 49153},{FDI_UMONITOR, 3, 1026, 49153},{FDI_UMWAIT, 3, 3072, 49153},{FDI_PTWRITE, 3, 1026, 49153},{FDI_GF2P8MULB, 14, 1034, 57344},{FDI_GF2P8AFFINEQB, 20558, 1098, 57344},{FDI_GF2P8AFFINEINVQB, 20558, 1098, 57344},{FDI_VGF2P8MULB, 45, 1066, 57344},{FDI_VGF2P8AFFINEQB, 20525, 1130, 57344},{FDI_VGF2P8AFFINEINVQB, 20525, 1130, 57344},{FDI_EVX_GF2P8MULB, 557, 1066, 57344},{FDI_EVX_GF2P8AFFINEQB, 21293, 1130, 57344},{FDI_EVX_GF2P8AFFINEINVQB, 21293, 1130, 57344},{FDI_ENQCMD, 14, 7176, 49160},{FDI_ENQCMDS, 14, 7176, 49160},{FDI_PCONFIG, 0, 1024, 49152},{FDI_WBNOINVD, 0, 1024, 32768},{FDI_RDPKRU, 0, 1024, 49152},{FDI_WRPKRU, 0, 1024, 49152},{FDI_RDFSBASE, 3, 1026, 49153},{FDI_RDGSBASE, 3, 1026, 49153},{FDI_WRFSBASE, 3, 1026, 49153},{FDI_WRGSBASE, 3, 1026, 49153},{FDI_XSAVE, 3, 33024, 49152},{FDI_XRSTOR, 3, 33024, 49152},{FDI_XSAVEOPT, 3, 33024, 49152},{FDI_CLWB, 3, 1024, 49152},{FDI_CLFLUSH, 3, 1024, 49152},{FDI_CLFLUSHOPT, 3, 1024, 49152},{FDI_XRSTORS, 3, 33024, 49152},{FDI_XSAVEC, 3, 33024, 49152},{FDI_XSAVES, 3, 33024, 49152},{FDI_RDRAND, 3, 1026, 16385},{FDI_RDSEED, 3, 1026, 16385},{FDI_RDPID, 3, 1026, 53249},{FDI_INVPCID, 14, 5128, 53256},{FDI_SHA1NEXTE, 14, 5120, 49152},{FDI_SHA1MSG1, 14, 5120, 49152},{FDI_SHA1MSG2, 14, 5120, 49152},{FDI_SHA256RNDS2, 30, 5120, 49152},{FDI_SHA256MSG1, 14, 5120, 49152},{FDI_SHA256MSG2, 14, 5120, 49152},{FDI_SHA1RNDS4, 20558, 5184, 49152},{FDI_XSUSLDTRK, 0, 1024, 49152},{FDI_XRESLDTRK, 0, 1024, 49152},{FDI_VPDPBUUD, 45, 1066, 57344},{FDI_VPDPBUSD, 45, 1066, 57344},{FDI_VPDPBSUD, 45, 1066, 57344},{FDI_VPDPBSSD, 45, 1066, 57344},{FDI_VPDPBUUDS, 45, 1066, 57344},{FDI_VPDPBUSDS, 45, 1066, 57344},{FDI_VPDPBSUDS, 45, 1066, 57344},{FDI_VPDPBSSDS, 45, 1066, 57344},{FDI_VPDPWSSD, 45, 1066, 57344},{FDI_VPDPWSSDS, 45, 1066, 57344},{FDI_VCVTNEOPH2PS, 14, 1034, 57344},{FDI_VCVTNEEPH2PS, 14, 1034, 57344},{FDI_VCVTNEEBF162PS, 14, 1034, 57344},{FDI_VCVTNEOBF162PS, 14, 1034, 57344},{FDI_VBCSTNESH2PS, 14, 2056, 57344},{FDI_VBCSTNEBF162PS, 14, 2056, 57344},{FDI_VCVTNEPS2BF16, 14, 1038, 59392},{FDI_VPMADD52LUQ, 45, 1066, 57344},{FDI_VPMADD52HUQ, 45, 1066, 57344},{FDI_HRESET, 20672, 1088, 49152},{FDI_SERIALIZE, 0, 1024, 49152},{FDI_UIRET, 0, 1024, 49152},{FDI_TESTUI, 0, 1024, 49152},{FDI_CLUI, 0, 1024, 49152},{FDI_STUI, 0, 1024, 49152},{FDI_SENDUIPI, 3, 1026, 53249},{FDI_WRMSRNS, 0, 1024, 49152},{FDI_RDMSRLIST, 0, 1024, 49152},{FDI_WRMSRLIST, 0, 1024, 49152},{FDI_AADD, 11, 1034, 49160},{FDI_AAND, 11, 1034, 49160},{FDI_AXOR, 11, 1034, 49160},{FDI_AOR, 11, 1034, 49160},{FDI_CMPOXADD, 27, 1066, 49224},{FDI_CMPNOXADD, 27, 1066, 49224},{FDI_CMPBXADD, 27, 1066, 49224},{FDI_CMPNBXADD, 27, 1066, 49224},{FDI_CMPZXADD, 27, 1066, 49224},{FDI_CMPNZXADD, 27, 1066, 49224},{FDI_CMPBEXADD, 27, 1066, 49224},{FDI_CMPNBEXADD, 27, 1066, 49224},{FDI_CMPSXADD, 27, 1066, 49224},{FDI_CMPNSXADD, 27, 1066, 49224},{FDI_CMPPXADD, 27, 1066, 49224},{FDI_CMPNPXADD, 27, 1066, 49224},{FDI_CMPLXADD, 27, 1066, 49224},{FDI_CMPNLXADD, 27, 1066, 49224},{FDI_CMPLEXADD, 27, 1066, 49224},{FDI_CMPNLEXADD, 27, 1066, 49224},{FDI_AESENCWIDE128KL, 3, 0, 49152},{FDI_AESDECWIDE128KL, 3, 0, 49152},{FDI_AESENCWIDE256KL, 3, 0, 49152},{FDI_AESDECWIDE256KL, 3, 0, 49152},{FDI_AESENC128KL, 14, 8, 57344},{FDI_LOADIWKEY, 14, 1034, 57344},{FDI_AESDEC128KL, 14, 8, 57344},{FDI_AESENC256KL, 14, 8, 57344},{FDI_AESDEC256KL, 14, 8, 57344},{FDI_ENCODEKEY128, 14, 3072, 49161},{FDI_ENCODEKEY256, 14, 3072, 49161},{FDI_LKGS, 3, 2048, 49153},{FDI_ERETU, 0, 1024, 49152},{FDI_ERETS, 0, 1024, 49152},{FDI_LDTILECFG, 3, 0, 49152},{FDI_STTILECFG, 3, 0, 49152},{FDI_TILERELEASE, 0, 1024, 49152},{FDI_TILEZERO, 12, 0, 49200},{FDI_TILELOADDT1, 14, 0, 49200},{FDI_TILESTORED, 11, 0, 49200},{FDI_TILELOADD, 14, 0, 49200},{FDI_TDPBF16PS, 30, 0, 49398},{FDI_TDPFP16PS, 30, 0, 49398},{FDI_TDPBUUD, 30, 0, 49398},{FDI_TDPBUSD, 30, 0, 49398},{FDI_TDPBSUD, 30, 0, 49398},{FDI_TDPBSSD, 30, 0, 49398},{FDI_TCMMRLFP16PS, 30, 0, 49398},{FDI_TCMMIMFP16PS, 30, 0, 49398},{FDI_PBNDKB, 0, 1024, 49152},{FDI_RDMSR, 16515, 27649, 49153},{FDI_WRMSRNS, 16578, 27649, 49153},{FDI_URDMSR, 11, 4096, 49161},{FDI_UWRMSR, 11, 4096, 49161},{FDI_URDMSR, 16515, 27649, 49153},{FDI_UWRMSR, 16578, 27649, 49153},{FDI_VSM4KEY4, 45, 1066, 57344},{FDI_VSM4RNDS4, 45, 1066, 57344},{FDI_EVX_ADDPS, 813, 1066, 58112},{FDI_EVX_ADDPD, 813, 1066, 58112},{FDI_EVX_ADDSS, 557, 21505, 49920},{FDI_EVX_ADDSD, 557, 29697, 49920},{FDI_EVX_AESENC, 45, 1066, 57344},{FDI_EVX_AESENCLAST, 45, 1066, 57344},{FDI_EVX_AESDEC, 45, 1066, 57344},{FDI_EVX_AESDECLAST, 45, 1066, 57344},{FDI_EVX_ANDPS, 813, 1066, 57344},{FDI_EVX_ANDPD, 813, 1066, 57344},{FDI_EVX_ANDNPS, 813, 1066, 57344},{FDI_EVX_ANDNPD, 813, 1066, 57344},{FDI_EVX_CMPPS, 21293, 1122, 57656},{FDI_EVX_CMPPD, 21293, 1122, 57656},{FDI_EVX_CMPSS, 21037, 17489, 49464},{FDI_EVX_CMPSD, 21037, 25681, 49464},{FDI_EVX_COMISS, 14, 3072, 49408},{FDI_EVX_COMISD, 14, 4096, 49408},{FDI_EVX_CVTDQ2PD, 782, 1035, 59648},{FDI_EVX_CVTPD2DQ, 782, 1038, 60160},{FDI_EVX_CVTDQ2PS, 782, 1034, 58112},{FDI_EVX_CVTPS2DQ, 782, 1034, 58112},{FDI_EVX_CVTPS2PD, 782, 1035, 59648},{FDI_EVX_CVTPD2PS, 782, 1038, 60160},{FDI_EVX_CVTSS2SI, 14, 3080, 49928},{FDI_EVX_CVTSD2SI, 14, 4104, 49928},{FDI_EVX_CVTSS2SD, 557, 21505, 49408},{FDI_EVX_CVTSD2SS, 557, 29697, 49920},{FDI_EVX_CVTSI2SS, 45, 5122, 49921},{FDI_EVX_CVTSI2SD, 45, 5122, 49921},{FDI_EVX_CVTTPD2DQ, 782, 1038, 59648},{FDI_EVX_CVTTPS2DQ, 782, 1034, 57600},{FDI_EVX_CVTTSD2SI, 14, 4104, 49416},{FDI_EVX_CVTTSS2SI, 14, 3080, 49416},{FDI_EVX_DIVPS, 813, 1066, 58112},{FDI_EVX_DIVPD, 813, 1066, 58112},{FDI_EVX_DIVSS, 557, 21505, 49920},{FDI_EVX_DIVSD, 557, 29697, 49920},{FDI_EVX_EXTRACTPS, 20555, 21569, 49153},{FDI_EVX_INSERTPS, 20525, 21569, 49152},{FDI_EVX_MAXPS, 813, 1066, 57600},{FDI_EVX_MAXPD, 813, 1066, 57600},{FDI_EVX_MAXSS, 557, 21505, 49408},{FDI_EVX_MAXSD, 557, 29697, 49408},{FDI_EVX_MINPS, 813, 1066, 57600},{FDI_EVX_MINPD, 813, 1066, 57600},{FDI_EVX_MINSS, 557, 21505, 49408},{FDI_EVX_MINSD, 557, 29697, 49408},{FDI_EVX_MOVAPS, 526, 1034, 57344},{FDI_EVX_MOVAPD, 526, 1034, 57344},{FDI_EVX_MOVAPS, 523, 1034, 57344},{FDI_EVX_MOVAPD, 523, 1034, 57344},{FDI_EVX_MOV_X2G, 11, 1034, 49153},{FDI_EVX_MOV_G2X, 14, 1034, 49153},{FDI_EVX_MOVDDUP, 526, 4104, 57344},{FDI_EVX_MOVDDUP, 526, 1034, 57344},{FDI_EVX_MOVDQA32, 526, 1034, 57344},{FDI_EVX_MOVDQA64, 526, 1034, 57344},{FDI_EVX_MOVDQA32, 523, 1034, 57344},{FDI_EVX_MOVDQA64, 523, 1034, 57344},{FDI_EVX_MOVDQU32, 526, 1034, 57344},{FDI_EVX_MOVDQU64, 526, 1034, 57344},{FDI_EVX_MOVDQU32, 523, 1034, 57344},{FDI_EVX_MOVDQU64, 523, 1034, 57344},{FDI_EVX_MOVDQU8, 526, 1034, 57344},{FDI_EVX_MOVDQU16, 526, 1034, 57344},{FDI_EVX_MOVDQU8, 523, 1034, 57344},{FDI_EVX_MOVDQU16, 523, 1034, 57344},{FDI_EVX_MOVLPS, 45, 29697, 49152},{FDI_EVX_MOVHLPS, 45, 5120, 49152},{FDI_EVX_MOVLPD, 45, 29697, 49152},{FDI_EVX_MOVLPS, 11, 4096, 49152},{FDI_EVX_MOVLPD, 11, 4096, 49152},{FDI_EVX_MOVHPS, 45, 29713, 49152},{FDI_EVX_MOVLHPS, 45, 29713, 49152},{FDI_EVX_MOVHPD, 45, 29713, 49152},{FDI_EVX_MOVHPS, 11, 4096, 49152},{FDI_EVX_MOVHPD, 11, 4096, 49152},{FDI_EVX_MOVNTDQA, 14, 1034, 57344},{FDI_EVX_MOVNTDQ, 11, 1034, 57344},{FDI_EVX_MOVNTPS, 11, 1034, 57344},{FDI_EVX_MOVNTPD, 11, 1034, 57344},{FDI_EVX_MOVQ, 14, 4096, 49152},{FDI_EVX_MOVQ, 11, 4096, 49152},{FDI_EVX_MOVSS, 526, 21505, 49152},{FDI_EVX_MOVSS, 557, 21505, 49152},{FDI_EVX_MOVSD, 526, 29697, 49152},{FDI_EVX_MOVSD, 557, 29697, 49152},{FDI_EVX_MOVSS, 523, 3072, 49152},{FDI_EVX_MOVSS, 551, 21508, 49152},{FDI_EVX_MOVSD, 523, 4096, 49152},{FDI_EVX_MOVSD, 551, 29700, 49152},{FDI_EVX_MOVSLDUP, 526, 1034, 57344},{FDI_EVX_MOVSHDUP, 526, 1034, 57344},{FDI_EVX_MOVUPS, 526, 1034, 57344},{FDI_EVX_MOVUPD, 526, 1034, 57344},{FDI_EVX_MOVUPS, 523, 1034, 57344},{FDI_EVX_MOVUPD, 523, 1034, 57344},{FDI_EVX_MULPS, 813, 1066, 58112},{FDI_EVX_MULPD, 813, 1066, 58112},{FDI_EVX_MULSS, 557, 21505, 49920},{FDI_EVX_MULSD, 557, 29697, 49920},{FDI_EVX_ORPS, 813, 1066, 57344},{FDI_EVX_ORPD, 813, 1066, 57344},{FDI_EVX_PABSB, 526, 1034, 57344},{FDI_EVX_PABSW, 526, 1034, 57344},{FDI_EVX_PABSD, 782, 1034, 57344},{FDI_EVX_PABSQ, 782, 1034, 57344},{FDI_EVX_PACKSSWB, 557, 1066, 57344},{FDI_EVX_PACKUSWB, 557, 1066, 57344},{FDI_EVX_PACKSSDW, 813, 1066, 57344},{FDI_EVX_PACKUSDW, 813, 1066, 57344},{FDI_EVX_PADDB, 557, 1066, 57344},{FDI_EVX_PADDW, 557, 1066, 57344},{FDI_EVX_PADDD, 813, 1066, 57344},{FDI_EVX_PADDQ, 813, 1066, 57344},{FDI_EVX_PADDSB, 557, 1066, 57344},{FDI_EVX_PADDSW, 557, 1066, 57344},{FDI_EVX_PADDUSB, 557, 1066, 57344},{FDI_EVX_PADDUSW, 557, 1066, 57344},{FDI_EVX_PALIGNR, 21037, 1130, 57344},{FDI_EVX_PANDD, 813, 1066, 57344},{FDI_EVX_PANDQ, 813, 1066, 57344},{FDI_EVX_PANDND, 813, 1066, 57344},{FDI_EVX_PANDNQ, 813, 1066, 57344},{FDI_EVX_PAVGB, 557, 1066, 57344},{FDI_EVX_PAVGW, 557, 1066, 57344},{FDI_EVX_PCLMULQDQ, 20525, 1130, 57344},{FDI_EVX_PCMPEQB, 557, 34, 57400},{FDI_EVX_PCMPEQW, 557, 34, 57400},{FDI_EVX_PCMPEQD, 813, 34, 57400},{FDI_EVX_PCMPEQQ, 813, 34, 57400},{FDI_EVX_PCMPGTB, 557, 34, 57400},{FDI_EVX_PCMPGTW, 557, 34, 57400},{FDI_EVX_PCMPGTD, 813, 34, 57400},{FDI_EVX_PCMPGTQ, 813, 34, 57400},{FDI_EVX_PEXTRB, 20555, 5185, 49152},{FDI_EVX_PEXTRB, 20555, 21569, 49153},{FDI_EVX_PEXTRW, 20558, 21572, 49160},{FDI_EVX_PEXTRW, 20555, 13377, 49152},{FDI_EVX_PEXTRW, 20555, 21569, 49153},{FDI_EVX_PEXTR, 20555, 5186, 49153},{FDI_EVX_PINSR, 20525, 5185, 49153},{FDI_EVX_PINSR, 20525, 13377, 49153},{FDI_EVX_PINSR, 20525, 5186, 49153},{FDI_EVX_PMADDUBSW, 557, 1066, 57344},{FDI_EVX_PMADDWD, 557, 1066, 57344},{FDI_EVX_PMINUB, 557, 1066, 57344},{FDI_EVX_PMAXUB, 557, 1066, 57344},{FDI_EVX_PMINSW, 557, 1066, 57344},{FDI_EVX_PMAXSW, 557, 1066, 57344},{FDI_EVX_PMINSB, 557, 1066, 57344},{FDI_EVX_PMINSD, 813, 1066, 57344},{FDI_EVX_PMINSQ, 813, 1066, 57344},{FDI_EVX_PMINUW, 557, 1066, 57344},{FDI_EVX_PMINUD, 813, 1066, 57344},{FDI_EVX_PMINUQ, 813, 1066, 57344},{FDI_EVX_PMAXSB, 557, 1066, 57344},{FDI_EVX_PMAXSD, 813, 1066, 57344},{FDI_EVX_PMAXSQ, 813, 1066, 57344},{FDI_EVX_PMAXUW, 557, 1066, 57344},{FDI_EVX_PMAXUD, 813, 1066, 57344},{FDI_EVX_PMAXUQ, 813, 1066, 57344},{FDI_EVX_PMOVSXBW, 526, 1035, 59392},{FDI_EVX_PMOVSXBD, 526, 1035, 61440},{FDI_EVX_PMOVSXBQ, 526, 1035, 63488},{FDI_EVX_PMOVSXWD, 526, 1035, 59392},{FDI_EVX_PMOVSXWQ, 526, 1035, 61440},{FDI_EVX_PMOVSXDQ, 526, 1035, 59392},{FDI_EVX_PMOVZXBW, 526, 1035, 59392},{FDI_EVX_PMOVZXBD, 526, 1035, 61440},{FDI_EVX_PMOVZXBQ, 526, 1035, 63488},{FDI_EVX_PMOVZXWD, 526, 1035, 59392},{FDI_EVX_PMOVZXWQ, 526, 1035, 61440},{FDI_EVX_PMOVZXDQ, 526, 1035, 59392},{FDI_EVX_PMULDQ, 813, 1066, 57344},{FDI_EVX_PMULHRSW, 557, 1066, 57344},{FDI_EVX_PMULHUW, 557, 1066, 57344},{FDI_EVX_PMULHW, 557, 1066, 57344},{FDI_EVX_PMULLW, 557, 1066, 57344},{FDI_EVX_PMULLD, 813, 1066, 57344},{FDI_EVX_PMULLQ, 813, 1066, 57344},{FDI_EVX_PMULUDQ, 813, 1066, 57344},{FDI_EVX_PORD, 813, 1066, 57344},{FDI_EVX_PORQ, 813, 1066, 57344},{FDI_EVX_PSADBW, 45, 1066, 57344},{FDI_EVX_PSHUFB, 557, 1066, 57344},{FDI_EVX_PSHUFD, 21326, 1098, 57344},{FDI_EVX_PSHUFHW, 21070, 1098, 57344},{FDI_EVX_PSHUFLW, 21070, 1098, 57344},{FDI_EVX_PSRLW, 21106, 1122, 57344},{FDI_EVX_PSRAW, 21106, 1122, 57344},{FDI_EVX_PSLLW, 21106, 1122, 57344},{FDI_EVX_PSRLD, 21362, 1122, 57344},{FDI_EVX_PSRAD, 21362, 1122, 57344},{FDI_EVX_PSLLD, 21362, 1122, 57344},{FDI_EVX_PSRLQ, 21362, 1122, 57344},{FDI_EVX_PSRAQ, 21362, 1122, 57344},{FDI_EVX_PSLLQ, 21362, 1122, 57344},{FDI_EVX_PSRLW, 557, 5160, 57344},{FDI_EVX_PSRLD, 557, 5160, 57344},{FDI_EVX_PSRLQ, 557, 5160, 57344},{FDI_EVX_PSRAW, 557, 5160, 57344},{FDI_EVX_PSRAD, 557, 5160, 57344},{FDI_EVX_PSRAQ, 557, 5160, 57344},{FDI_EVX_PSLLW, 557, 5160, 57344},{FDI_EVX_PSLLD, 557, 5160, 57344},{FDI_EVX_PSLLQ, 557, 5160, 57344},{FDI_EVX_PSRLDQ, 20594, 1122, 57344},{FDI_EVX_PSLLDQ, 20594, 1122, 57344},{FDI_EVX_PSUBB, 557, 1066, 57344},{FDI_EVX_PSUBW, 557, 1066, 57344},{FDI_EVX_PSUBD, 813, 1066, 57344},{FDI_EVX_PSUBQ, 813, 1066, 57344},{FDI_EVX_PSUBSB, 557, 1066, 57344},{FDI_EVX_PSUBSW, 557, 1066, 57344},{FDI_EVX_PSUBUSB, 557, 1066, 57344},{FDI_EVX_PSUBUSW, 557, 1066, 57344},{FDI_EVX_PUNPCKLBW, 557, 1066, 57344},{FDI_EVX_PUNPCKLWD, 557, 1066, 57344},{FDI_EVX_PUNPCKLDQ, 813, 1066, 57344},{FDI_EVX_PUNPCKLQDQ, 813, 1066, 57344},{FDI_EVX_PUNPCKHBW, 557, 1066, 57344},{FDI_EVX_PUNPCKHWD, 557, 1066, 57344},{FDI_EVX_PUNPCKHDQ, 813, 1066, 57344},{FDI_EVX_PUNPCKHQDQ, 813, 1066, 57344},{FDI_EVX_PXORD, 813, 1066, 57344},{FDI_EVX_PXORQ, 813, 1066, 57344},{FDI_EVX_SHUFPS, 21293, 1130, 57344},{FDI_EVX_SHUFPD, 21293, 1130, 57344},{FDI_EVX_SQRTPS, 782, 1034, 58112},{FDI_EVX_SQRTPD, 782, 1034, 58112},{FDI_EVX_SQRTSS, 557, 21505, 49920},{FDI_EVX_SQRTSD, 557, 29697, 49920},{FDI_EVX_SUBPS, 813, 1066, 58112},{FDI_EVX_SUBPD, 813, 1066, 58112},{FDI_EVX_SUBSS, 557, 21505, 49920},{FDI_EVX_SUBSD, 557, 29697, 49920},{FDI_EVX_UCOMISS, 14, 3072, 49408},{FDI_EVX_UCOMISD, 14, 4096, 49408},{FDI_EVX_UNPCKLPS, 813, 1066, 57344},{FDI_EVX_UNPCKLPD, 813, 1066, 57344},{FDI_EVX_UNPCKHPS, 813, 1066, 57344},{FDI_EVX_UNPCKHPD, 813, 1066, 57344},{FDI_EVX_ALIGND, 21293, 1130, 57344},{FDI_EVX_ALIGNQ, 21293, 1130, 57344},{FDI_EVX_BLENDMPS, 813, 1066, 57344},{FDI_EVX_BLENDMPD, 813, 1066, 57344},{FDI_EVX_BROADCASTSS, 526, 3080, 57344},{FDI_EVX_BROADCASTF32X2, 526, 4104, 57344},{FDI_EVX_BROADCASTSD, 526, 4104, 57344},{FDI_EVX_BROADCASTF32X4, 526, 5128, 57344},{FDI_EVX_BROADCASTF64X2, 526, 5128, 57344},{FDI_EVX_BROADCASTF32X8, 526, 6152, 57344},{FDI_EVX_BROADCASTF64X4, 526, 6152, 57344},{FDI_EVX_COMPRESSPS, 523, 3080, 57344},{FDI_EVX_COMPRESSPS, 523, 1034, 57344},{FDI_EVX_COMPRESSPD, 523, 4104, 57344},{FDI_EVX_COMPRESSPD, 523, 1034, 57344},{FDI_EVX_CVTNE2PS2BF16, 813, 1066, 57344},{FDI_EVX_CVTNEPS2BF16, 782, 1038, 59392},{FDI_EVX_CVTPS2QQ, 782, 1035, 60160},{FDI_EVX_CVTPD2QQ, 782, 1034, 58112},{FDI_EVX_CVTPS2UDQ, 782, 1034, 58112},{FDI_EVX_CVTPD2UDQ, 782, 1038, 60160},{FDI_EVX_CVTPS2UQQ, 782, 1035, 60160},{FDI_EVX_CVTPD2UQQ, 782, 1034, 58112},{FDI_EVX_CVTPH2PS, 526, 1035, 59648},{FDI_EVX_CVTPS2PH, 21067, 1099, 59648},{FDI_EVX_CVTQQ2PD, 782, 1034, 58112},{FDI_EVX_CVTQQ2PS, 782, 1038, 60160},{FDI_EVX_CVTSD2USI, 14, 4104, 49928},{FDI_EVX_CVTSS2USI, 14, 3080, 49928},{FDI_EVX_CVTUSI2SD, 45, 5122, 49921},{FDI_EVX_CVTUSI2SS, 45, 5122, 49921},{FDI_EVX_CVTTPS2QQ, 782, 1035, 59648},{FDI_EVX_CVTTPD2QQ, 782, 1034, 57600},{FDI_EVX_CVTTPS2UDQ, 782, 1034, 57600},{FDI_EVX_CVTTPD2UDQ, 782, 1038, 59648},{FDI_EVX_CVTTPS2UQQ, 782, 1035, 59648},{FDI_EVX_CVTTPD2UQQ, 782, 1034, 57600},{FDI_EVX_CVTTSD2USI, 14, 4104, 49416},{FDI_EVX_CVTTSS2USI, 14, 3080, 49416},{FDI_EVX_CVTUDQ2PD, 782, 1035, 59648},{FDI_EVX_CVTUDQ2PS, 782, 1034, 58112},{FDI_EVX_CVTUQQ2PD, 782, 1034, 58112},{FDI_EVX_CVTUQQ2PS, 782, 1038, 60160},{FDI_EVX_DBPSADBW, 21037, 1130, 57344},{FDI_EVX_DPBF16PS, 813, 1066, 57344},{FDI_EVX_EXPANDPS, 526, 3080, 57344},{FDI_EVX_EXPANDPS, 526, 1034, 57344},{FDI_EVX_EXPANDPD, 526, 4104, 57344},{FDI_EVX_EXPANDPD, 526, 1034, 57344},{FDI_EVX_EXTRACTF32X4, 21067, 5192, 57344},{FDI_EVX_EXTRACTF64X2, 21067, 5192, 57344},{FDI_EVX_EXTRACTF32X8, 21067, 6216, 57344},{FDI_EVX_EXTRACTF64X4, 21067, 6216, 57344},{FDI_EVX_EXTRACTI32X4, 21067, 5192, 57344},{FDI_EVX_EXTRACTI64X2, 21067, 5192, 57344},{FDI_EVX_EXTRACTI32X8, 21067, 6216, 57344},{FDI_EVX_EXTRACTI64X4, 21067, 6216, 57344},{FDI_EVX_FIXUPIMMPS, 21293, 1130, 57600},{FDI_EVX_FIXUPIMMPD, 21293, 1130, 57600},{FDI_EVX_FIXUPIMMSS, 21037, 21569, 49408},{FDI_EVX_FIXUPIMMSD, 21037, 29761, 49408},{FDI_EVX_FMADDSUB132PS, 813, 1066, 58112},{FDI_EVX_FMADDSUB132PD, 813, 1066, 58112},{FDI_EVX_FMSUBADD132PS, 813, 1066, 58112},{FDI_EVX_FMSUBADD132PD, 813, 1066, 58112},{FDI_EVX_FMADD132PS, 813, 1066, 58112},{FDI_EVX_FMADD132PD, 813, 1066, 58112},{FDI_EVX_FMADD132SS, 557, 21505, 49920},{FDI_EVX_FMADD132SD, 557, 29697, 49920},{FDI_EVX_FMSUB132PS, 813, 1066, 58112},{FDI_EVX_FMSUB132PD, 813, 1066, 58112},{FDI_EVX_FMSUB132SS, 557, 21505, 49920},{FDI_EVX_FMSUB132SD, 557, 29697, 49920},{FDI_EVX_FNMADD132PS, 813, 1066, 58112},{FDI_EVX_FNMADD132PD, 813, 1066, 58112},{FDI_EVX_FNMADD132SS, 557, 21505, 49920},{FDI_EVX_FNMADD132SD, 557, 29697, 49920},{FDI_EVX_FNMSUB132PS, 813, 1066, 58112},{FDI_EVX_FNMSUB132PD, 813, 1066, 58112},{FDI_EVX_FNMSUB132SS, 557, 21505, 49920},{FDI_EVX_FNMSUB132SD, 557, 29697, 49920},{FDI_EVX_FMADDSUB213PS, 813, 1066, 58112},{FDI_EVX_FMADDSUB213PD, 813, 1066, 58112},{FDI_EVX_FMSUBADD213PS, 813, 1066, 58112},{FDI_EVX_FMSUBADD213PD, 813, 1066, 58112},{FDI_EVX_FMADD213PS, 813, 1066, 58112},{FDI_EVX_FMADD213PD, 813, 1066, 58112},{FDI_EVX_FMADD213SS, 557, 21505, 49920},{FDI_EVX_FMADD213SD, 557, 29697, 49920},{FDI_EVX_FMSUB213PS, 813, 1066, 58112},{FDI_EVX_FMSUB213PD, 813, 1066, 58112},{FDI_EVX_FMSUB213SS, 557, 21505, 49920},{FDI_EVX_FMSUB213SD, 557, 29697, 49920},{FDI_EVX_FNMADD213PS, 813, 1066, 58112},{FDI_EVX_FNMADD213PD, 813, 1066, 58112},{FDI_EVX_FNMADD213SS, 557, 21505, 49920},{FDI_EVX_FNMADD213SD, 557, 29697, 49920},{FDI_EVX_FNMSUB213PS, 813, 1066, 58112},{FDI_EVX_FNMSUB213PD, 813, 1066, 58112},{FDI_EVX_FNMSUB213SS, 557, 21505, 49920},{FDI_EVX_FNMSUB213SD, 557, 29697, 49920},{FDI_EVX_FMADDSUB231PS, 813, 1066, 58112},{FDI_EVX_FMADDSUB231PD, 813, 1066, 58112},{FDI_EVX_FMSUBADD231PS, 813, 1066, 58112},{FDI_EVX_FMSUBADD231PD, 813, 1066, 58112},{FDI_EVX_FMADD231PS, 813, 1066, 58112},{FDI_EVX_FMADD231PD, 813, 1066, 58112},{FDI_EVX_FMADD231SS, 557, 21505, 49920},{FDI_EVX_FMADD231SD, 557, 29697, 49920},{FDI_EVX_FMSUB231PS, 813, 1066, 58112},{FDI_EVX_FMSUB231PD, 813, 1066, 58112},{FDI_EVX_FMSUB231SS, 557, 21505, 49920},{FDI_EVX_FMSUB231SD, 557, 29697, 49920},{FDI_EVX_FNMADD231PS, 813, 1066, 58112},{FDI_EVX_FNMADD231PD, 813, 1066, 58112},{FDI_EVX_FNMADD231SS, 557, 21505, 49920},{FDI_EVX_FNMADD231SD, 557, 29697, 49920},{FDI_EVX_FNMSUB231PS, 813, 1066, 58112},{FDI_EVX_FNMSUB231PD, 813, 1066, 58112},{FDI_EVX_FNMSUB231SS, 557, 21505, 49920},{FDI_EVX_FNMSUB231SD, 557, 29697, 49920},{FDI_EVX_FPCLASSPS, 21326, 1090, 57400},{FDI_EVX_FPCLASSPD, 21326, 1090, 57400},{FDI_EVX_FPCLASSSS, 21070, 17473, 49208},{FDI_EVX_FPCLASSSD, 21070, 25665, 49208},{FDI_EVX_GATHERDPS, 33294, 3080, 57344},{FDI_EVX_GATHERDPD, 33294, 4104, 57344},{FDI_EVX_GATHERQPS, 33294, 3084, 59392},{FDI_EVX_GATHERQPD, 33294, 4104, 57344},{FDI_EVX_GETEXPPS, 782, 1034, 57600},{FDI_EVX_GETEXPPD, 782, 1034, 57600},{FDI_EVX_GETEXPSS, 557, 21505, 49408},{FDI_EVX_GETEXPSD, 557, 29697, 49408},{FDI_EVX_GETMANTPS, 21326, 1098, 57600},{FDI_EVX_GETMANTPD, 21326, 1098, 57600},{FDI_EVX_GETMANTSS, 21037, 21569, 49408},{FDI_EVX_GETMANTSD, 21037, 29761, 49408},{FDI_EVX_INSERTF32X4, 21037, 5224, 57344},{FDI_EVX_INSERTF64X2, 21037, 5224, 57344},{FDI_EVX_INSERTF32X8, 21037, 6248, 57344},{FDI_EVX_INSERTF64X4, 21037, 6248, 57344},{FDI_EVX_INSERTI32X4, 21037, 5224, 57344},{FDI_EVX_INSERTI64X2, 21037, 5224, 57344},{FDI_EVX_INSERTI32X8, 21037, 6248, 57344},{FDI_EVX_INSERTI64X4, 21037, 6248, 57344},{FDI_EVX_P2INTERSECTD, 301, 34, 57400},{FDI_EVX_P2INTERSECTQ, 301, 34, 57400},{FDI_EVX_PBLENDMB, 557, 1066, 57344},{FDI_EVX_PBLENDMW, 557, 1066, 57344},{FDI_EVX_PBLENDMD, 813, 1066, 57344},{FDI_EVX_PBLENDMQ, 813, 1066, 57344},{FDI_EVX_PBROADCAST, 526, 1032, 57345},{FDI_EVX_PBROADCAST, 526, 2056, 57345},{FDI_EVX_PBROADCAST, 526, 3080, 57345},{FDI_EVX_PBROADCAST, 526, 4104, 57345},{FDI_EVX_PBROADCASTB, 526, 1032, 57344},{FDI_EVX_PBROADCASTW, 526, 2056, 57344},{FDI_EVX_PBROADCASTD, 526, 3080, 57344},{FDI_EVX_PBROADCASTQ, 526, 4104, 57344},{FDI_EVX_BROADCASTI32X2, 526, 4104, 57344},{FDI_EVX_BROADCASTI32X4, 526, 5128, 57344},{FDI_EVX_BROADCASTI64X2, 526, 5128, 57344},{FDI_EVX_BROADCASTI32X8, 526, 6152, 57344},{FDI_EVX_BROADCASTI64X4, 526, 6152, 57344},{FDI_EVX_PBROADCASTMB2Q, 14, 8, 57351},{FDI_EVX_PBROADCASTMW2D, 14, 8, 57351},{FDI_EVX_PCMPUD, 21293, 98, 57400},{FDI_EVX_PCMPD, 21293, 98, 57400},{FDI_EVX_PCMPUQ, 21293, 98, 57400},{FDI_EVX_PCMPQ, 21293, 98, 57400},{FDI_EVX_PCMPUB, 21037, 98, 57400},{FDI_EVX_PCMPB, 21037, 98, 57400},{FDI_EVX_PCMPUW, 21037, 98, 57400},{FDI_EVX_PCMPW, 21037, 98, 57400},{FDI_EVX_PCOMPRESSB, 523, 1032, 57344},{FDI_EVX_PCOMPRESSB, 523, 1034, 57344},{FDI_EVX_PCOMPRESSW, 523, 2056, 57344},{FDI_EVX_PCOMPRESSW, 523, 1034, 57344},{FDI_EVX_PCOMPRESSD, 523, 3080, 57344},{FDI_EVX_PCOMPRESSD, 523, 1034, 57344},{FDI_EVX_PCOMPRESSQ, 523, 4104, 57344},{FDI_EVX_PCOMPRESSQ, 523, 1034, 57344},{FDI_EVX_PCONFLICTD, 782, 1034, 57344},{FDI_EVX_PCONFLICTQ, 782, 1034, 57344},{FDI_EVX_PDPBUSD, 813, 1066, 57344},{FDI_EVX_PDPBUSDS, 813, 1066, 57344},{FDI_EVX_PDPWSSD, 813, 1066, 57344},{FDI_EVX_PDPWSSDS, 813, 1066, 57344},{FDI_EVX_PERMB, 557, 1066, 57344},{FDI_EVX_PERMW, 557, 1066, 57344},{FDI_EVX_PERMD, 813, 1066, 57344},{FDI_EVX_PERMI2B, 557, 1066, 57344},{FDI_EVX_PERMI2W, 557, 1066, 57344},{FDI_EVX_PERMI2D, 813, 1066, 57344},{FDI_EVX_PERMI2Q, 813, 1066, 57344},{FDI_EVX_PERMI2PS, 813, 1066, 57344},{FDI_EVX_PERMI2PD, 813, 1066, 57344},{FDI_EVX_PERMILPS, 813, 1066, 57344},{FDI_EVX_PERMILPD, 813, 1066, 57344},{FDI_EVX_PERMILPS, 21326, 1098, 57344},{FDI_EVX_PERMILPD, 21326, 1098, 57344},{FDI_EVX_PERMPS, 813, 1066, 57344},{FDI_EVX_PERMPD, 813, 1066, 57344},{FDI_EVX_PERMQ, 813, 1066, 57344},{FDI_EVX_PERMQ, 21326, 1098, 57344},{FDI_EVX_PERMPD, 21326, 1098, 57344},{FDI_EVX_PERMT2B, 557, 1066, 57344},{FDI_EVX_PERMT2W, 557, 1066, 57344},{FDI_EVX_PERMT2D, 813, 1066, 57344},{FDI_EVX_PERMT2Q, 813, 1066, 57344},{FDI_EVX_PERMT2PS, 813, 1066, 57344},{FDI_EVX_PERMT2PD, 813, 1066, 57344},{FDI_EVX_PEXPANDB, 526, 1032, 57344},{FDI_EVX_PEXPANDB, 526, 1034, 57344},{FDI_EVX_PEXPANDW, 526, 2056, 57344},{FDI_EVX_PEXPANDW, 526, 1034, 57344},{FDI_EVX_PEXPANDD, 526, 3080, 57344},{FDI_EVX_PEXPANDD, 526, 1034, 57344},{FDI_EVX_PEXPANDQ, 526, 4104, 57344},{FDI_EVX_PEXPANDQ, 526, 1034, 57344},{FDI_EVX_PGATHERDD, 33294, 3080, 57344},{FDI_EVX_PGATHERDQ, 33294, 4104, 57344},{FDI_EVX_PGATHERQD, 33294, 3084, 59392},{FDI_EVX_PGATHERQQ, 33294, 4104, 57344},{FDI_EVX_PLZCNTD, 782, 1034, 57344},{FDI_EVX_PLZCNTQ, 782, 1034, 57344},{FDI_EVX_PMADD52LUQ, 813, 1066, 57344},{FDI_EVX_PMADD52HUQ, 813, 1066, 57344},{FDI_EVX_PMOVB2M, 14, 2, 57400},{FDI_EVX_PMOVW2M, 14, 2, 57400},{FDI_EVX_PMOVD2M, 14, 2, 57400},{FDI_EVX_PMOVQ2M, 14, 2, 57400},{FDI_EVX_PMOVM2B, 14, 8, 57351},{FDI_EVX_PMOVM2W, 14, 8, 57351},{FDI_EVX_PMOVM2D, 14, 8, 57351},{FDI_EVX_PMOVM2Q, 14, 8, 57351},{FDI_EVX_PMOVWB, 523, 1035, 59392},{FDI_EVX_PMOVSWB, 523, 1035, 59392},{FDI_EVX_PMOVUSWB, 523, 1035, 59392},{FDI_EVX_PMOVDB, 523, 1035, 61440},{FDI_EVX_PMOVSDB, 523, 1035, 61440},{FDI_EVX_PMOVUSDB, 523, 1035, 61440},{FDI_EVX_PMOVQB, 523, 1035, 63488},{FDI_EVX_PMOVSQB, 523, 1035, 63488},{FDI_EVX_PMOVUSQB, 523, 1035, 63488},{FDI_EVX_PMOVDW, 523, 1035, 59392},{FDI_EVX_PMOVSDW, 523, 1035, 59392},{FDI_EVX_PMOVUSDW, 523, 1035, 59392},{FDI_EVX_PMOVQW, 523, 1035, 61440},{FDI_EVX_PMOVSQW, 523, 1035, 61440},{FDI_EVX_PMOVUSQW, 523, 1035, 61440},{FDI_EVX_PMOVQD, 523, 1035, 59392},{FDI_EVX_PMOVSQD, 523, 1035, 59392},{FDI_EVX_PMOVUSQD, 523, 1035, 59392},{FDI_EVX_PMULTISHIFTQB, 813, 1066, 57344},{FDI_EVX_POPCNTB, 526, 1034, 57344},{FDI_EVX_POPCNTW, 526, 1034, 57344},{FDI_EVX_POPCNTD, 782, 1034, 57344},{FDI_EVX_POPCNTQ, 782, 1034, 57344},{FDI_EVX_PRORVD, 813, 1066, 57344},{FDI_EVX_PRORVQ, 813, 1066, 57344},{FDI_EVX_PRORD, 21362, 1122, 57344},{FDI_EVX_PRORQ, 21362, 1122, 57344},{FDI_EVX_PROLVD, 813, 1066, 57344},{FDI_EVX_PROLVQ, 813, 1066, 57344},{FDI_EVX_PROLD, 21362, 1122, 57344},{FDI_EVX_PROLQ, 21362, 1122, 57344},{FDI_EVX_PSCATTERDD, 33291, 3080, 57344},{FDI_EVX_PSCATTERDQ, 33291, 4104, 57344},{FDI_EVX_PSCATTERQD, 33291, 3084, 59392},{FDI_EVX_PSCATTERQQ, 33291, 4104, 57344},{FDI_EVX_PSHLDW, 21037, 1130, 57344},{FDI_EVX_PSHLDD, 21293, 1130, 57344},{FDI_EVX_PSHLDQ, 21293, 1130, 57344},{FDI_EVX_PSHLDVW, 557, 1066, 57344},{FDI_EVX_PSHLDVD, 813, 1066, 57344},{FDI_EVX_PSHLDVQ, 813, 1066, 57344},{FDI_EVX_PSHRDW, 21037, 1130, 57344},{FDI_EVX_PSHRDD, 21293, 1130, 57344},{FDI_EVX_PSHRDQ, 21293, 1130, 57344},{FDI_EVX_PSHRDVW, 557, 1066, 57344},{FDI_EVX_PSHRDVD, 813, 1066, 57344},{FDI_EVX_PSHRDVQ, 813, 1066, 57344},{FDI_EVX_PSHUFBITQMB, 557, 34, 57400},{FDI_EVX_PSLLVW, 557, 1066, 57344},{FDI_EVX_PSLLVD, 813, 1066, 57344},{FDI_EVX_PSLLVQ, 813, 1066, 57344},{FDI_EVX_PSRAVW, 557, 1066, 57344},{FDI_EVX_PSRAVD, 813, 1066, 57344},{FDI_EVX_PSRAVQ, 813, 1066, 57344},{FDI_EVX_PSRLVW, 557, 1066, 57344},{FDI_EVX_PSRLVD, 813, 1066, 57344},{FDI_EVX_PSRLVQ, 813, 1066, 57344},{FDI_EVX_PTERNLOGD, 21293, 1130, 57344},{FDI_EVX_PTERNLOGQ, 21293, 1130, 57344},{FDI_EVX_PTESTMB, 557, 34, 57400},{FDI_EVX_PTESTMW, 557, 34, 57400},{FDI_EVX_PTESTMD, 813, 34, 57400},{FDI_EVX_PTESTMQ, 813, 34, 57400},{FDI_EVX_PTESTNMB, 557, 34, 57400},{FDI_EVX_PTESTNMW, 557, 34, 57400},{FDI_EVX_PTESTNMD, 813, 34, 57400},{FDI_EVX_PTESTNMQ, 813, 34, 57400},{FDI_EVX_RANGEPS, 21293, 1130, 57600},{FDI_EVX_RANGEPD, 21293, 1130, 57600},{FDI_EVX_RANGESS, 21037, 21569, 49408},{FDI_EVX_RANGESD, 21037, 29761, 49408},{FDI_EVX_RCP14PS, 782, 1034, 57344},{FDI_EVX_RCP14PD, 782, 1034, 57344},{FDI_EVX_RCP14SS, 557, 21505, 49152},{FDI_EVX_RCP14SD, 557, 29697, 49152},{FDI_EVX_REDUCEPS, 21326, 1098, 57600},{FDI_EVX_REDUCEPD, 21326, 1098, 57600},{FDI_EVX_REDUCESS, 21037, 21569, 49408},{FDI_EVX_REDUCESD, 21037, 29761, 49408},{FDI_EVX_RNDSCALEPS, 21326, 1098, 57600},{FDI_EVX_RNDSCALEPD, 21326, 1098, 57600},{FDI_EVX_RNDSCALESS, 21037, 21569, 49408},{FDI_EVX_RNDSCALESD, 21037, 29761, 49408},{FDI_EVX_RSQRT14PS, 782, 1034, 57344},{FDI_EVX_RSQRT14PD, 782, 1034, 57344},{FDI_EVX_RSQRT14SS, 557, 21505, 49152},{FDI_EVX_RSQRT14SD, 557, 29697, 49152},{FDI_EVX_SCALEFPS, 813, 1066, 58112},{FDI_EVX_SCALEFPD, 813, 1066, 58112},{FDI_EVX_SCALEFSS, 557, 21505, 49920},{FDI_EVX_SCALEFSD, 557, 29697, 49920},{FDI_EVX_SCATTERDPS, 33291, 3080, 57344},{FDI_EVX_SCATTERDPD, 33291, 4104, 57344},{FDI_EVX_SCATTERQPS, 33291, 3084, 59392},{FDI_EVX_SCATTERQPD, 33291, 4104, 57344},{FDI_EVX_SHUFF32X4, 21293, 1130, 57344},{FDI_EVX_SHUFF64X2, 21293, 1130, 57344},{FDI_EVX_SHUFI32X4, 21293, 1130, 57344},{FDI_EVX_SHUFI64X2, 21293, 1130, 57344},{FDI_EVX_XORPS, 813, 1066, 57344},{FDI_EVX_XORPD, 813, 1066, 57344},{FDI_KANDB, 45, 1024, 49343},{FDI_KANDW, 45, 2048, 49343},{FDI_KANDD, 45, 3072, 49343},{FDI_KANDQ, 45, 4096, 49343},{FDI_KANDNB, 45, 1024, 49343},{FDI_KANDNW, 45, 2048, 49343},{FDI_KANDND, 45, 3072, 49343},{FDI_KANDNQ, 45, 4096, 49343},{FDI_KNOTB, 14, 1024, 49215},{FDI_KNOTW, 14, 2048, 49215},{FDI_KNOTD, 14, 3072, 49215},{FDI_KNOTQ, 14, 4096, 49215},{FDI_KORB, 45, 1024, 49343},{FDI_KORW, 45, 2048, 49343},{FDI_KORD, 45, 3072, 49343},{FDI_KORQ, 45, 4096, 49343},{FDI_KXNORB, 45, 1024, 49343},{FDI_KXNORW, 45, 2048, 49343},{FDI_KXNORD, 45, 3072, 49343},{FDI_KXNORQ, 45, 4096, 49343},{FDI_KXORB, 45, 1024, 49343},{FDI_KXORW, 45, 2048, 49343},{FDI_KXORD, 45, 3072, 49343},{FDI_KXORQ, 45, 4096, 49343},{FDI_KADDB, 45, 1024, 49343},{FDI_KADDW, 45, 2048, 49343},{FDI_KADDD, 45, 3072, 49343},{FDI_KADDQ, 45, 4096, 49343},{FDI_KUNPCKBW, 45, 9220, 49343},{FDI_KUNPCKWD, 45, 18436, 49343},{FDI_KUNPCKDQ, 45, 27652, 49343},{FDI_KORTESTB, 14, 1024, 49215},{FDI_KORTESTW, 14, 2048, 49215},{FDI_KORTESTD, 14, 3072, 49215},{FDI_KORTESTQ, 14, 4096, 49215},{FDI_KMOVB, 14, 1024, 49215},{FDI_KMOVW, 14, 2048, 49215},{FDI_KMOVD, 14, 3072, 49215},{FDI_KMOVQ, 14, 4096, 49215},{FDI_KMOVB, 11, 1024, 49208},{FDI_KMOVW, 11, 2048, 49208},{FDI_KMOVD, 11, 3072, 49208},{FDI_KMOVQ, 11, 4096, 49208},{FDI_KMOVB, 14, 17409, 49209},{FDI_KMOVW, 14, 18433, 49209},{FDI_KMOVD, 14, 3072, 49209},{FDI_KMOVQ, 14, 4096, 49209},{FDI_KMOVB, 14, 17412, 49167},{FDI_KMOVW, 14, 18436, 49167},{FDI_KMOVD, 14, 3072, 49167},{FDI_KMOVQ, 14, 4096, 49167},{FDI_KTESTB, 14, 1024, 49215},{FDI_KTESTW, 14, 2048, 49215},{FDI_KTESTD, 14, 3072, 49215},{FDI_KTESTQ, 14, 4096, 49215},{FDI_KSHIFTRB, 20558, 1088, 49215},{FDI_KSHIFTRW, 20558, 2112, 49215},{FDI_KSHIFTRD, 20558, 3136, 49215},{FDI_KSHIFTRQ, 20558, 4160, 49215},{FDI_KSHIFTLB, 20558, 1088, 49215},{FDI_KSHIFTLW, 20558, 2112, 49215},{FDI_KSHIFTLD, 20558, 3136, 49215},{FDI_KSHIFTLQ, 20558, 4160, 49215},{FDI_EVX_RNDSCALEPH, 21326, 1098, 58624},{FDI_EVX_RNDSCALESH, 21037, 13377, 49408},{FDI_EVX_GETMANTPH, 21326, 1098, 58624},{FDI_EVX_GETMANTSH, 21037, 13377, 49408},{FDI_EVX_REDUCEPH, 21326, 1098, 58624},{FDI_EVX_REDUCESH, 21037, 13377, 49408},{FDI_EVX_FPCLASSPH, 21326, 66, 58424},{FDI_EVX_FPCLASSSH, 21070, 9281, 49208},{FDI_EVX_CMPPH, 21293, 98, 58680},{FDI_EVX_CMPSH, 21037, 9297, 49464},{FDI_EVX_MOVSH, 526, 13313, 49152},{FDI_EVX_MOVSH, 557, 13313, 49152},{FDI_EVX_MOVSH, 523, 2048, 49152},{FDI_EVX_MOVSH, 551, 13316, 49152},{FDI_EVX_CVTSS2SH, 557, 21505, 49920},{FDI_EVX_CVTPS2PHX, 782, 1038, 60160},{FDI_EVX_CVTSI2SH, 45, 5122, 49921},{FDI_EVX_CVTTSH2SI, 14, 2056, 49416},{FDI_EVX_CVTSH2SI, 14, 2056, 49928},{FDI_EVX_UCOMISH, 14, 2048, 49408},{FDI_EVX_COMISH, 14, 2048, 49408},{FDI_EVX_SQRTPH, 782, 1034, 59136},{FDI_EVX_SQRTSH, 557, 13313, 49920},{FDI_EVX_ADDPH, 813, 1066, 59136},{FDI_EVX_ADDSH, 557, 13313, 49920},{FDI_EVX_MULPH, 813, 1066, 59136},{FDI_EVX_MULSH, 557, 13313, 49920},{FDI_EVX_CVTPH2PD, 782, 1035, 62720},{FDI_EVX_CVTPD2PH, 782, 1038, 62208},{FDI_EVX_CVTSH2SD, 557, 13313, 49408},{FDI_EVX_CVTSD2SH, 557, 29697, 49920},{FDI_EVX_CVTDQ2PH, 782, 1038, 60160},{FDI_EVX_CVTQQ2PH, 782, 1038, 62208},{FDI_EVX_CVTPH2DQ, 782, 1035, 61184},{FDI_EVX_CVTTPH2DQ, 782, 1035, 60672},{FDI_EVX_SUBPH, 813, 1066, 59136},{FDI_EVX_SUBSH, 557, 13313, 49920},{FDI_EVX_MINPH, 813, 1066, 58624},{FDI_EVX_MINSH, 557, 13313, 49408},{FDI_EVX_DIVPH, 813, 1066, 59136},{FDI_EVX_DIVSH, 557, 13313, 49920},{FDI_EVX_MAXPH, 813, 1066, 58624},{FDI_EVX_MAXSH, 557, 13313, 49408},{FDI_EVX_MOVW_G2X, 14, 13313, 49153},{FDI_EVX_CVTTPH2UDQ, 782, 1035, 60672},{FDI_EVX_CVTTPH2UQQ, 782, 1035, 62720},{FDI_EVX_CVTTSH2USI, 14, 2056, 49416},{FDI_EVX_CVTPH2UDQ, 782, 1035, 61184},{FDI_EVX_CVTPH2UQQ, 782, 1035, 63232},{FDI_EVX_CVTSH2USI, 14, 2056, 49928},{FDI_EVX_CVTTPH2QQ, 782, 1035, 62720},{FDI_EVX_CVTUDQ2PH, 782, 1038, 60160},{FDI_EVX_CVTUQQ2PH, 782, 1038, 62208},{FDI_EVX_CVTPH2QQ, 782, 1035, 63232},{FDI_EVX_CVTUSI2SH, 45, 5122, 49921},{FDI_EVX_CVTTPH2UW, 782, 1034, 58624},{FDI_EVX_CVTTPH2W, 782, 1034, 58624},{FDI_EVX_CVTPH2UW, 782, 1034, 59136},{FDI_EVX_CVTPH2W, 782, 1034, 59136},{FDI_EVX_CVTW2PH, 782, 1034, 59136},{FDI_EVX_CVTUW2PH, 782, 1034, 59136},{FDI_EVX_MOVW_X2G, 11, 2048, 49153},{FDI_EVX_CVTPH2PSX, 782, 1035, 60672},{FDI_EVX_CVTSH2SS, 557, 13313, 49408},{FDI_EVX_SCALEFPH, 813, 1066, 59136},{FDI_EVX_SCALEFSH, 557, 13313, 49920},{FDI_EVX_GETEXPPH, 782, 1034, 58624},{FDI_EVX_GETEXPSH, 557, 13313, 49408},{FDI_EVX_RCPPH, 782, 1034, 58368},{FDI_EVX_RCPSH, 557, 13313, 49152},{FDI_EVX_RSQRTPH, 782, 1034, 58368},{FDI_EVX_RSQRTSH, 557, 13313, 49152},{FDI_EVX_FMADDCPH, 813, 1066, 58112},{FDI_EVX_FCMADDCPH, 813, 1066, 58112},{FDI_EVX_FMADDCSH, 557, 21505, 49920},{FDI_EVX_FCMADDCSH, 557, 21505, 49920},{FDI_EVX_FMULCPH, 813, 1066, 58112},{FDI_EVX_FCMULCPH, 813, 1066, 58112},{FDI_EVX_FMULCSH, 557, 21505, 49920},{FDI_EVX_FCMULCSH, 557, 21505, 49920},{FDI_EVX_FMADDSUB132PH, 813, 1066, 59136},{FDI_EVX_FMADDSUB213PH, 813, 1066, 59136},{FDI_EVX_FMADDSUB231PH, 813, 1066, 59136},{FDI_EVX_FMSUBADD132PH, 813, 1066, 59136},{FDI_EVX_FMSUBADD213PH, 813, 1066, 59136},{FDI_EVX_FMSUBADD231PH, 813, 1066, 59136},{FDI_EVX_FMADD132PH, 813, 1066, 59136},{FDI_EVX_FMADD213PH, 813, 1066, 59136},{FDI_EVX_FMADD231PH, 813, 1066, 59136},{FDI_EVX_FMADD132SH, 557, 13313, 49920},{FDI_EVX_FMADD213SH, 557, 13313, 49920},{FDI_EVX_FMADD231SH, 557, 13313, 49920},{FDI_EVX_FMSUB132PH, 813, 1066, 59136},{FDI_EVX_FMSUB213PH, 813, 1066, 59136},{FDI_EVX_FMSUB231PH, 813, 1066, 59136},{FDI_EVX_FMSUB132SH, 557, 13313, 49920},{FDI_EVX_FMSUB213SH, 557, 13313, 49920},{FDI_EVX_FMSUB231SH, 557, 13313, 49920},{FDI_EVX_FNMADD132PH, 813, 1066, 59136},{FDI_EVX_FNMADD213PH, 813, 1066, 59136},{FDI_EVX_FNMADD231PH, 813, 1066, 59136},{FDI_EVX_FNMADD132SH, 557, 13313, 49920},{FDI_EVX_FNMADD213SH, 557, 13313, 49920},{FDI_EVX_FNMADD231SH, 557, 13313, 49920},{FDI_EVX_FNMSUB132PH, 813, 1066, 59136},{FDI_EVX_FNMSUB213PH, 813, 1066, 59136},{FDI_EVX_FNMSUB231PH, 813, 1066, 59136},{FDI_EVX_FNMSUB132SH, 557, 13313, 49920},{FDI_EVX_FNMSUB213SH, 557, 13313, 49920},{FDI_EVX_FNMSUB231SH, 557, 13313, 49920} -#elif defined(FD_DECODE_TABLE_STRTAB1) -"xtestuiretf2xm1xsusldtrkaddbextrclacall farplahfabsfencenclslarcrc32xsetbvaddpdepbndkblsidtcmmimfp16pshufwaitcmmrlfp16psmasha1msg1xsavesahfaddpconfigetsecbw cwdecdqencluincsspopaaaddaamcommitdcalldtilecfgxsaveoptwritenclvaddphltrdfsbaseamcalldsarxabortdpbf16psaveprevsspopfbldasbblsmskinitdpbssdxsaveclcldemotencodekey128xrstorssprefetchit0xresldtrkadddxlatblsrdgsbaseamopscaseamretdpbsud0xgetbvaddpsenduipinsertqxendbr32xbegint1wrusserializencodekey256wrssetaandwrpkrud1wrmsrnsetbendbr64wrmsrlistaclflushoptdpbusdwrgsbasetclgint3dnowbinvdbpsadbwbnoinvdivpdpbssdsetgenqcmdsetleaverrdmsrlistgintoutsetnclidtdpbuud2wrfsbasetnovzeroupperetsetnprefetchit1vzeroallfenceretumonitorxvxorpsetnsetnzvxorpdvunpcklpsetovunpcklpdvunpckhpsetpausetssbsyscallfsaverwvunpckhpdvucomissetzcntdpfp16psgdtileloaddt1vucomisha1msg2vucomisdvtestpsha1nextevtestpdvsubssha1rnds4vsubsha256msg1vsubsdvsubpsha256msg2vsubphresetilereleasevsubpdvstmxcsrdpidvsqrtssha256rnds2vsqrtshlxvsqrtsdvsqrtpshrxvsqrtphvsqrtpdvsm4rnds4vsm4key4vshufpsmswapgstosttilecfgvshufpdvshufi64x2vshufi32x4vshuff64x2vshuff32x4vscatterqpsysenterdpkrumwaitxvscatterqpdvscatterdpsysexitilestoredvscatterdpdvscalefssysretilezerorxvscalefshvscalefsdvscalefpsvscalefphvscalefpdvrsqrtssvrsqrtshvrsqrtpsvrsqrtphvrsqrt14ssvrsqrt14sdvrsqrt14psvrsqrt14pdvroundssvroundsdvroundpsvroundpdvrndscalessvrndscaleshvrndscalesdvrndscalepsvrndscalephvrndscalepdvreducessvreduceshvreducesdvreducepsvreducephvreducepdvrcpssvrcpshvrcppsvrcpphvrcp14ssvrcp14sdvrcp14psvrcp14pdvrangessvrangesdvrangepsvrangepdvpxorqvpxordpmclrssbsyvpunpcklwdvpunpcklqdqvpunpckldqvpunpcklbwvpunpckhwdvpunpckhqdqvpunpckhdqvpunpckhbwvptestnmwvptestnmqvptestnmdvptestnmboundvptestmwvptestmqvptestmdvptestmbsrdprurdmsrdrandvpternlogqvpternlogdvpsubwvpsubuswvpsubusbswaprefetchntaasvpsubswvpsubsbtcltsvpsubqvpsubdvpsubbtrdseedvpsrlwvpsrlvwvpsrlvqvpsrlvdivphadddvpsrlqvpsrldqvpsrawvpsravwvpsravqvpsravdivpsadbwvpsraqvpsradcxvpsllwvpsllvwvpsllvqvpsllvdivsdvpsllqvpslldqvpsignwvpsigndvpsignbtsvpshuflwvpshufhwvpshufdecstprefetcht0vpshufbitqmbzhinveptlbsynclwbvpshrdwvpshrdvwvpshrdvqvpshrdvdivshvpshrdqvpshrddvpshldwvpshldvwvpshldvqvpshldvdivssvpshldqvpshlddvpscatterqqvpscatterqdvpscatterdqvpscatterddvprorvqvprorvdpbf16psvprorqvprordssprefetcht1vprolvqvprolvdppdvprolqvproldvporqvpordtscpuidvpopcntwvpopcntqvpopcntdvpopcntbvpmuludqvpmultishiftqbvpmullwvpmullqvpmulldvpmulhwvpmulhuwrmsrep montmulxvpmulhrswvpmuldqvpmovzxwqvpmovzxwdvpmovzxdqvpmovzxbwvpmovzxbqvpmovzxbdvpmovwbvpmovw2mfencevpmovuswbvpmovusqwvpmovusqdvpmovusqbvpmovusdwvpmovusdbvpmovsxwqvpmovsxwdvpmovsxdqvpmovsxbwvpmovsxbqvpmovsxbdvpmovswbvpmovsqwvpmovsqdvpmovsqbvpmovsdwvpmovsdbvpmovqwvpmovqdvpmovqbvpmovq2movdir64bvpmovmskbvpmovm2wvpmovm2qvpmovm2dvpmovm2bvpmovdwvpmovdbvpmovd2movdirinvlpgadoxvpmovb2movdq2qvpminuwvpminuqvpminudvpminubvpminswvpminsqvpminsdvpminsbvpmaxuwvpmaxuqvpmaxudvpmaxubvpmaxswvpmaxsqvpmaxsdvpmaxsbvpmaskmovq2dqvpmaskmovdppsvpmaddwdvpmaddubswvpmadd52luqvpmadd52huqvplzcntqvplzcntdvpinsrwvpinsrqvpinsrdvpinsrbvphsubwvphsubswvphsubdvphminposuwvphaddwvphaddswvpgatherqqvpgatherqdvpgatherdqvpgatherddvpextrwvpextrqvpextrdvpextrbvpexpandwvpexpandqvpexpanddvpexpandbvpermwvpermt2wvpermt2qvpermt2psvpermt2pdvpermt2dvpermt2bvpermqvpermpsvpermpdvpermilpsvpermilpdvpermi2wvpermi2qvpermi2psvpermi2pdvpermi2dvpermi2bvpermdvpermbvperm2i128vperm2f128vpdpwssdsvpdpbuudsvpdpbusdsvpdpbsudsvpconflictqvpconflictdvpcompresswvpcompressqvpcompressdvpcompressbvpcmpwvpcmpuwvpcmpuqvpcmpudvpcmpubvpcmpqvpcmpistrmpadjustvpcmpistrinvlpgbvpcmpgtwvpcmpgtqvpcmpgtdvpcmpgtbvpcmpestrmpqueryvpcmpestrinvpcidvpcmpeqwvpcmpeqqvpcmpeqdvpcmpeqbvpcmpdvpcmpbexaddvpclmulqdqvpbroadcastwvpbroadcastqvpbroadcastmw2dvpbroadcastmb2qvpbroadcastdvpbroadcastbvpblendwvpblendvbcstnebf162psvpblendmwvpblendmqvpblendmdvpblendmbvpblenddvpavgwvpavgbvpandqvpandnqvpandndvpanddvpalignrep xcryptcbclzerovpaddwvpadduswvpaddusbvpaddswvpaddsbvpaddqvpadddvpaddbvpackuswbvpackusdwvpacksswbvpackssdwvpabswvpabsqvpabsdvpabsbvp2intersectqvp2intersectdvorpsvorpdvmxonegvmxoffreevmwritevmulssvmulshvmulsdvmulpsvmulphvmulpdvmsavexpandpdvmrunvmresumevmreadvmptrstvmptrldvmpsadbwvmovwvmovupsvmovupdvmovssvmovslduprefetcht2vmovshduprefetchwt1vmovsdvmovqvmovntpsvmovntpdvmovntdqaesdec128klgdtvmovmskpsvmovmskpdvmovlpsvmovlpdvmovlhpsvmovhpsvmovhpdvmovhlpsvmovdqu8vmovdqu64vmovdqu32vmovdqu16vmovdqa64vmovdqa32vmovddupushaesdec256klgsvmovapsvmovapdvmmcallkgsvmloadiwkeyvmlaunchvminssvminshvminsdvminpsvminphvminpdvmgexitvmfuncmcmovaddsdvmclearep xcryptcfbstpushfchsvmcallmswvmaxssvmaxshvmaxsdvmaxpsvmaxphvmaxpdvmaskmovpsvmaskmovpdvmaskmovdquvldmxcsrep xcryptctrep xcryptecbvlddquvinsertpsvinserti64x4vinserti64x2vinserti32x8vinserti32x4vinserti128vinsertf64x4vinsertf64x2vinsertf32x8vinsertf32x4vinsertf128vhsubpsvhsubpdvhaddpsvhaddpdvgf2p8mulbvgf2p8affineqbvgf2p8affineinvqbvgetmantssvgetmantshvgetmantsdvgetmantpsvgetmantphvgetmantpdvgetexpssvgetexpshvgetexpsdvgetexppsvgetexpphvgetexppdvgatherqpsvgatherqpdvgatherdpsvgatherdpdvfpclassssvfpclassshvfpclasssdvfpclasspsvfpclassphvfpclasspdvfnmsub231ssvfnmsub231shvfnmsub231sdvfnmsub231psvfnmsub231phvfnmsub231pdvfnmsub213ssvfnmsub213shvfnmsub213sdvfnmsub213psvfnmsub213phvfnmsub213pdvfnmsub132ssvfnmsub132shvfnmsub132sdvfnmsub132psvfnmsub132phvfnmsub132pdvfnmadd231ssvfnmadd231shvfnmadd231sdvfnmadd231psvfnmadd231phvfnmadd231pdvfnmadd213ssvfnmadd213shvfnmadd213sdvfnmadd213psvfnmadd213phvfnmadd213pdvfnmadd132ssvfnmadd132shvfnmadd132sdvfnmadd132psvfnmadd132phvfnmadd132pdvfmulcshvfmulcphvfmsubadd231psvfmsubadd231phvfmsubadd231pdvfmsubadd213psvfmsubadd213phvfmsubadd213pdvfmsubadd132psvfmsubadd132phvfmsubadd132pdvfmsub231ssvfmsub231shvfmsub231sdvfmsub231psvfmsub231phvfmsub231pdvfmsub213ssvfmsub213shvfmsub213sdvfmsub213psvfmsub213phvfmsub213pdvfmsub132ssvfmsub132shvfmsub132sdvfmsub132psvfmsub132phvfmsub132pdvfmaddsub231psvfmaddsub231phvfmaddsub231pdvfmaddsub213psvfmaddsub213phvfmaddsub213pdvfmaddsub132psvfmaddsub132phvfmaddsub132pdvfmaddcshvfmaddcphvfmadd231ssvfmadd231shvfmadd231sdvfmadd231psvfmadd231phvfmadd231pdvfmadd213ssvfmadd213shvfmadd213sdvfmadd213psvfmadd213phvfmadd213pdvfmadd132ssvfmadd132shvfmadd132sdvfmadd132psvfmadd132phvfmadd132pdvfixupimmssvfixupimmsdvfixupimmpsvfixupimmpdvfcmulcshvfcmulcphvfcmaddcshvfcmaddcphvextractpsvextracti64x4vextracti64x2vextracti32x8vextracti32x4vextracti128vextractf64x4vextractf64x2vextractf32x8vextractf32x4vextractf128vexpandpsvcvtw2phvcvtuw2phvcvtusi2ssvcvtusi2shvcvtusi2sdvcvtuqq2psvcvtuqq2phvcvtuqq2pdvcvtudq2psvcvtudq2phvcvtudq2pdvcvttss2usinvvpidvcvttss2sivcvttsh2usivcvttsh2sivcvttsd2usivcvttsd2sivcvttps2uqqvcvttps2udqvcvttps2qqvcvttps2dqvcvttph2wvcvttph2uwvcvttph2uqqvcvttph2udqvcvttph2qqvcvttph2dqvcvttpd2uqqvcvttpd2udqvcvttpd2qqvcvttpd2dqvcvtss2usivcvtss2sivcvtss2shvcvtss2sdvcvtsi2ssvcvtsi2shvcvtsi2sdvcvtsh2usivcvtsh2ssvcvtsh2sivcvtsh2sdvcvtsd2usivcvtsd2ssvcvtsd2sivcvtsd2shvcvtqq2psvcvtqq2phvcvtqq2pdvcvtps2uqqvcvtps2udqvcvtps2qqvcvtps2phxvcvtps2pdvcvtps2dqvcvtph2wvcvtph2uwvcvtph2uqqvcvtph2udqvcvtph2qqvcvtph2psxvcvtph2pdvcvtph2dqvcvtpd2uqqvcvtpd2udqvcvtpd2qqvcvtpd2psvcvtpd2phvcvtpd2dqvcvtneps2bf16vcvtneoph2psvcvtneobf162psvcvtneeph2psvcvtneebf162psvcvtne2ps2bf16vcvtdq2psvcvtdq2phvcvtdq2pdvcompresspsvcompresspdvcomissvcomishvcomisdvcmpssvcmpshvcmpsdvcmppsvcmpphvcmppdvbroadcastssvbroadcastsdvbroadcasti64x4vbroadcasti64x2vbroadcasti32x8vbroadcasti32x4vbroadcasti32x2vbroadcasti128vbroadcastf64x4vbroadcastf64x2vbroadcastf32x8vbroadcastf32x4vbroadcastf32x2vbroadcastf128vblendvpsvblendvpdvblendpsvblendpdvblendmpsvblendmpdvbcstnesh2psvandpsvandpdvandnpsvandnpdvalignqvaligndvaeskeygenassistvaesimcmovcmovgevaesenclastvaesdeclastvaddsubpsvaddsubpdvaddssvaddshrsmovntirmpupdatermpreadrep xstorep xcryptofbrep xsha256rep xsha1pvalidatemovntssmovntsdmovntqloopzloopnzlodskxorwkxorqkxordkxorbkxnorwkxnorqkxnordkxnorbkunpckwdkunpckdqkunpckbwktestwktestqktestdktestbkshiftrwkshiftrqkshiftrdkshiftrbkshiftlwkshiftlqkshiftldkshiftlbkorwkortestwkortestqkortestdkortestbkorqkordkorbknotwknotqknotdknotbkmovwkmovbkandwkandqkandnwkandnqkandndkandnbkanddkandbkaddwkaddqjzjsjpjojnzjnsjnpjnojncmovlejmp farjlejgejcxz jecxzjrcxzjbejaesdecwide128klfyl2xp1fxtractfxsavefxrstorfxchfxamfucomppfucomipftstfsubrpfsubpfstswfstpfstenvfstcwd cdq cqofsqrtfsincosfscalefrstorfrndintfptanfprem1fpatanfnopfmulpfldzfldpifldln2fldlg2fldl2tfldl2efldenvfldcwfld1fisubrfisttpfistpfinitfincstpfimulfildfidivrficompfiaddfemmsfdivrpfdivpfcosfcomppfcomipfcmovufcmovnufcmovnefcmovnbefcmovefcmovbefclexcvttps2picvttpd2picvtps2picvtpi2pscvtpi2pdcvtpd2picmpzxaddcmpxchgcmpsxaddcmppxaddcmpoxaddcmpnzxaddcmpnsxaddcmpnpxaddcmpnoxaddcmpnlxaddcmpnlexaddcmpnbxaddcmpnbexaddcmplxaddcmplexaddcmpbxaddcmovzcmovscmovpcmovocmovnzcmovnscmovnpcmovnocmovncaxoraoraesencwide256klaesencwide128klaesenc256klaesenc128klaesdecwide256kl" -#elif defined(FD_DECODE_TABLE_STRTAB2) -529,177,178,178,182,459,1777,1917,1917,24,2749,4189,4189,4329,7548,8045,8688,7537,8677,8666,7537,8651,8636,7521,7505,460,3786,8633,41,8629,27,85,279,357,1669,49,1705,1763,1793,1793,1816,1985,2036,35,35,32,300,302,302,498,498,523,601,1544,1795,166,2050,3823,4433,4435,8380,7526,7530,7530,8007,8007,8623,8617,8611,8605,8599,8594,8589,8584,8579,3421,3596,8571,8562,8554,8544,8535,8525,8516,8507,8498,8489,8480,8472,8464,7163,8456,8449,8449,8441,2282,63,153,8142,181,275,159,552,55,164,216,309,441,414,481,566,566,1086,632,663,73,220,394,4438,7582,7576,7547,7547,7536,7536,7497,7490,7483,7476,7470,7464,7443,7434,7371,7356,7341,7326,7311,7282,7267,7252,7237,7222,7210,7198,7192,7186,7180,7174,7168,7162,7155,7148,7141,7130,7119,7110,7101,7092,7078,7013,7004,6995,6986,6977,6967,6957,6948,6939,6929,6929,6920,6910,6900,6891,6883,6874,6865,6855,6855,6846,6836,6826,6817,6808,6799,6790,6781,6772,6762,6753,6744,6735,6725,6716,6707,6698,6689,6680,6671,6661,6651,6641,6630,6619,6609,6599,6588,6577,6567,6558,6548,6538,6527,6516,6506,6495,6485,6474,6464,6447,6437,6427,6417,6407,6397,6387,6377,6367,6357,6348,6340,537,551,1849,1897,1946,2083,2132,2208,4042,6331,6306,6293,6280,6267,6242,6229,6216,6203,6193,6183,6173,6164,6155,6144,6133,6122,6111,6100,6089,6078,6067,6056,6045,6034,6023,6012,6001,5990,5979,5968,5957,5946,5935,5924,5913,5904,5895,5881,5867,5853,5839,5825,5811,5797,5783,5769,5758,5747,5736,5725,5714,5703,5692,5681,5670,5659,5648,5637,5626,5615,5604,5593,5582,5571,5557,5543,5529,5515,5501,5487,5473,5459,5445,5437,5429,5417,5405,5393,5381,5369,5357,5345,5333,5321,5309,5297,5285,5273,5261,5249,5237,5225,5213,5201,5189,5177,5165,5153,5141,5129,5117,5105,5093,5081,5069,5057,5045,5033,5021,5009,4997,4987,4977,4967,4957,4947,4937,4927,4917,4907,4897,4888,4879,4870,4861,4852,4843,4833,4823,4813,4803,4793,4783,4766,4752,4742,4691,4679,4667,4655,4632,4620,4608,4596,4587,4512,4506,4500,4494,4488,4482,4415,4409,4403,4397,4391,4385,4349,4342,4318,4309,4300,4291,4282,4273,4265,4257,4250,4243,4235,4228,4221,4181,4181,4173,4165,4160,4154,4135,4135,4117,4111,4104,4097,4092,4092,4092,4092,4032,4026,4020,4014,4008,4002,3974,3969,3956,3943,3937,3931,3925,3919,3910,3901,3892,3883,3877,3871,3865,3858,3851,3843,3835,3829,3804,3798,3791,3784,3778,3772,3766,3749,3740,3731,3722,3615,3681,3669,3654,3639,3627,3615,3605,3594,3588,3580,3572,3564,3556,3516,3508,3500,3492,3453,3446,3439,3432,3425,3419,3408,3397,3386,3375,3364,3353,3335,3335,3317,3317,3291,3285,3277,3269,3260,3251,3243,3235,3226,3217,3210,3203,3197,3189,3181,3172,3163,3155,3147,3141,3132,3123,3114,3105,3077,3098,3077,3067,3057,3047,3037,2961,2953,2945,2934,2923,2913,2905,2872,2865,2858,2851,2844,2837,2830,2823,2816,2809,2802,2795,2788,2781,2774,2767,2753,2730,2723,2716,2708,2700,2692,2684,2659,2652,2645,2638,2630,2622,2614,2606,2598,2590,2581,2572,2563,2554,2545,2536,2527,2518,2509,2500,2491,2482,2469,2462,2453,2444,2435,2426,2417,2408,2401,2392,2369,2362,2355,2348,2341,2327,2319,2311,2303,2295,2287,2275,2270,2264,2258,2248,2241,2223,2217,2203,2196,1900,2185,2174,2163,2152,2145,2138,2126,2118,2110,2103,2096,2089,2077,2069,2061,2054,2025,2025,2004,1996,1988,1958,1958,1952,1941,1934,1927,1921,1913,1907,1892,1885,1878,1872,1865,1865,1859,1844,1837,1830,1824,1811,1805,1799,1787,1780,1756,1748,1742,1732,1722,1698,1690,1682,1674,1661,1652,1643,1634,1624,1614,1603,1593,1583,1573,1562,1552,1536,1530,1522,1514,1506,1498,1490,1482,1474,1466,1460,1448,1433,1424,1415,1406,1397,1388,1377,1366,1355,1344,1333,1322,1280,1270,1260,1250,1242,1226,1209,1200,1191,1182,1173,1150,1139,1113,1102,1073,1063,1053,1043,1033,1026,1001,977,970,960,953,944,927,909,888,873,867,853,839,809,795,760,751,717,708,696,690,676,10,47,138,138,272,4461,4469,8386,8379,8379,8373,8365,8365,8358,8351,8345,8333,8339,8339,8333,8333,8329,2009,8318,8324,8318,8318,8313,3990,8308,8302,8302,8296,8296,8292,8287,8280,8275,8264,8270,8264,8258,8258,8210,8254,8249,8243,8237,8231,8225,8219,8214,8210,5430,8205,8201,8195,8189,8189,8184,8177,8171,744,8165,8158,8158,8153,8124,8139,8133,8129,8124,8113,8119,8113,8113,8109,8095,8102,8102,8095,8095,104,8091,8087,8080,8074,8067,8060,8060,148,4767,4753,4743,225,893,8297,8288,169,169,169,406,425,425,526,591,535,2039,2743,2743,3485,3549,6457,6,8044,8041,8026,8026,8023,8023,8020,8020,8013,8013,8005,8002,7999,7996,7993,7991,7989,7987,7985,23,348,7980,7975,7970,7965,7959,7953,7947,7941,7936,7931,7926,2897,2884,7921,7916,7911,7906,7901,7897,7893,7889,7881,7873,7865,7857,7853,7845,7837,7829,7821,7813,7805,7797,7789,7783,7777,7771,7765,7757,7749,7741,7735,7729,7723,7717,7712,7707,7702,7697,44,60,4550,241,195,575,575,1131,658,743,4199,4339,602,4362,194,4478,4368,7693,7682,7687,7682,58,4005,226,2947,184,2476,8433,8425,8417,8409,8400,8391,8314,2881,2666,2760,7676,2640,2885,3938,3932,3920,3911,3902,3884,3878,3872,3866,3859,3852,3844,3836,3830,3805,3109,3785,3773,3767,3581,3573,3557,3517,3509,3493,3078,1853,3030,3023,3005,2997,2990,2962,2914,2906,2852,2845,2796,2789,2676,2393,2370,2363,2342,2320,2271,540,2026,100,1980,1973,1966,1959,1953,1922,1914,1873,1866,1860,1825,1812,1806,1800,1788,1781,1757,1749,1743,1625,1615,1594,1584,1574,1553,1531,668,668,2410,2410,8381,2666,2737,7590,2538,2538,2410,2410,2410,2410,2410,2321,2388,1096,1096,3983,8202,7902,249,594,594,728,80,142,77,3078,174,174,2288,269,329,329,640,1767,2015,2231,4125,4143,4143,118,210,4325,4325,4465,7653,31,62,228,360,581,581,922,1090,1540,1707,1716,1818,2227,2278,2278,2380,3811,4450,4556,4568,7620,7644,7633,7612,8202,329,7,7,3467,3532,7605,7596,2243,1169,1169,7588,322,135,243,243,259,277,372,234,366,375,399,433,456,477,520,562,562,572,572,597,619,636,681,685,704,725,731,731,767,50,781,122,801,823,844,857,878,933,949,2105,949,966,2056,966,87,283,18,1007,74,395,4439,7577,7568,7559,7484,7477,4046,6335,7427,7419,7410,7401,7193,7181,7175,7163,811,762,7111,7093,7005,6987,6875,6866,6782,6773,6717,6699,6690,6672,6652,6549,6507,6465,552,1898,1947,2133,2254,2901,6194,3086,4736,4729,4722,4715,4588,406,4582,4539,4513,4501,2867,4483,4416,4404,2811,4386,4350,4343,2666,4319,4301,4266,4258,4251,4244,4236,4229,4222,4213,4204,4182,4182,4174,4166,7669,7662,2640,2624,4136,4118,4112,4105,4098,4085,4033,4021,4015,4003,692,678,3938,3932,3920,3911,3902,3893,3884,3878,3872,3866,3859,3852,3844,3836,3830,3805,3109,3785,3773,3767,3702,3694,3606,3581,3573,3565,3557,3541,3525,3517,3509,3501,3493,3477,3460,3099,3092,3085,3078,1853,3030,3023,3012,3005,2997,2990,2983,2976,2969,2962,2914,2906,2873,2866,2852,2845,2838,2824,2817,2810,2796,2789,2782,2768,2676,2582,2573,2564,2555,2546,2537,2454,2445,2436,2427,2418,2409,2402,2393,2370,2363,2356,2342,2320,2271,540,2026,2005,1997,1989,1980,1973,1966,1959,1959,1953,1922,1914,1873,1866,1866,1860,1825,1812,1806,1800,1788,1781,1757,1749,1743,1635,1625,1615,1604,1594,1584,1574,1563,1553,1531,1455,1443,1315,1307,1299,1291,1235,1219,1027,1002,978,961,954,928,910,874,868,840,810,761,752,718,709,697,691,677,495,8140,3678,588,7230,916,1014,3465,1017,3,840,1009,737,1083,1123,1158,90,108,190,251,288,381,507,605,773,1,1,784,784,898,1129,1163,2044,727,769,386,468,610,5,667,1095,1711,2375,73,394,4438,7576,7567,7558,7547,7547,7536,7536,7520,7504,7483,7476,7470,7464,3708,7452,7426,7418,7409,7400,7386,7297,7210,7198,7192,7180,7174,7162,7155,7141,7110,7092,7064,7052,7038,7026,7013,7004,6986,6929,6874,6865,6855,6781,6772,6716,6698,6689,6671,6651,6548,6506,6464,551,1897,1946,2132,2253,2900,578,747,6319,6255,6193,6100,6078,6067,6045,6034,6012,6001,5979,5968,5946,5935,5913,5881,5853,5839,5811,5797,5769,5758,5736,5725,5703,5692,5670,5659,5637,5626,5604,5593,5571,5557,5529,5515,5487,5473,5445,5417,5393,5381,5357,5345,5321,5309,5285,5273,5249,5237,5213,5201,5177,5165,5141,5129,5105,5093,5069,5057,5033,5021,4997,4927,4917,4907,4897,4766,4752,4742,4735,4728,4721,4714,4703,4644,4587,4581,4549,4538,4528,4518,4512,4500,4494,4482,4473,4444,4428,4421,4415,4403,4397,4385,4377,4366,4356,4349,4342,4265,4318,4300,4265,4257,4250,4243,4235,4228,4221,4212,4203,4181,4181,4173,4165,4160,4154,4135,4117,4111,4104,4097,4084,4077,4070,4064,4056,4051,4038,4032,4020,4014,4002,3995,3986,3979,3974,3969,3937,3931,3919,3910,3901,3892,3883,3877,3871,3865,3858,3851,3843,3835,3829,3804,3778,3784,3772,3766,3758,3701,3693,3681,3669,3627,3615,3605,3580,3572,3564,3556,3540,3524,3516,3508,3500,3492,3476,3459,554,554,3344,3344,3335,3335,3326,3326,3317,3317,3307,3297,3285,3226,3217,3210,3203,3197,3098,3091,3084,3077,3067,3057,3047,3037,1852,3029,3022,3011,3004,2996,2989,2982,2975,2968,2961,2934,2923,2913,2905,2892,2879,2872,2865,2851,2844,2837,2823,2816,2809,2795,2788,2781,2767,2675,2581,2572,2563,2554,2545,2536,2453,2444,2435,2426,2417,2408,2401,2392,2369,2362,2355,2341,2319,2270,1900,2025,2004,1996,1988,1979,1972,1965,1958,1958,1952,1941,1934,1921,1913,1892,1872,1865,1865,1859,1844,1837,1824,1811,1805,1799,1787,1780,1756,1748,1742,1634,1624,1614,1603,1593,1583,1573,1562,1552,1530,1454,1442,1314,1306,1298,1290,1234,1218,1026,1001,993,984,977,960,953,927,915,909,873,867,839,832,817,809,760,751,717,708,696,690,676,651,624,533,545,613,514,471,488,471,463,453,429,246,3601,421,8452,0,413,389,353,677,340,321,321,130,295,204,130,68,7616,15,0 -#elif defined(FD_DECODE_TABLE_STRTAB3) -5,3,3,4,3,4,3,3,4,3,4,6,11,11,10,15,15,6,11,11,10,15,15,6,15,3,4,3,4,4,5,4,6,4,5,3,3,5,2,3,3,3,4,4,8,4,3,3,8,7,10,4,3,8,4,4,4,6,3,5,6,5,5,6,5,6,6,6,6,6,6,5,5,5,5,3,9,8,9,8,10,9,10,9,9,9,9,9,8,8,4,8,7,7,8,5,5,12,11,3,3,3,3,5,5,5,12,12,7,7,6,7,5,5,5,6,6,6,6,6,6,7,11,7,11,7,7,7,7,6,6,9,9,15,15,15,15,15,15,15,15,15,15,12,12,6,6,6,6,6,6,7,7,7,11,11,9,9,9,14,13,9,9,9,9,10,10,9,9,9,10,9,10,10,9,8,9,9,9,10,9,10,10,9,9,9,9,9,9,10,9,9,9,10,9,9,9,9,9,9,10,10,10,11,11,10,10,11,11,10,9,10,10,11,11,10,11,10,11,10,11,10,10,10,10,10,10,10,10,10,9,8,9,6,6,6,6,6,6,9,9,9,13,13,13,13,13,13,13,13,10,10,10,9,9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,9,14,14,14,14,14,14,14,14,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,14,14,14,14,14,14,14,14,14,8,8,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,10,10,10,10,10,10,9,9,9,9,9,9,10,10,10,10,10,10,17,14,10,12,12,12,12,12,12,12,12,9,6,6,6,6,6,6,6,6,6,6,6,6,7,7,8,9,9,9,9,9,8,8,7,7,8,7,7,8,9,8,8,5,6,6,9,9,6,7,7,5,5,4,4,6,6,6,6,6,6,5,5,13,13,6,6,6,6,9,9,9,9,6,6,6,7,7,8,8,6,8,6,7,7,6,6,6,9,9,9,9,11,12,12,15,15,12,12,10,6,6,8,8,8,8,8,8,8,8,6,7,7,7,7,6,11,11,11,11,11,11,8,9,8,9,6,6,8,8,9,9,8,8,9,9,7,7,6,8,8,9,9,8,8,6,9,9,9,9,6,7,7,10,10,10,10,6,8,8,11,11,10,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,7,7,8,8,8,8,8,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,8,7,9,9,9,9,9,9,7,9,8,7,7,7,7,14,8,8,8,8,8,5,5,6,6,7,7,6,6,7,7,7,11,11,11,11,7,7,8,8,8,7,7,7,8,8,8,7,7,12,7,8,8,6,7,6,7,7,7,6,6,6,7,7,7,6,6,7,6,7,7,7,6,6,6,6,7,7,8,8,6,10,10,8,8,8,8,9,9,9,9,10,10,11,10,10,10,11,10,6,6,8,8,8,8,8,8,8,8,6,6,9,9,9,9,9,9,11,11,11,11,11,11,10,10,10,10,8,8,9,9,9,9,9,9,11,11,11,11,10,10,10,10,7,7,7,7,7,7,7,7,6,6,6,6,6,6,8,8,8,9,9,9,9,6,6,5,4,4,5,4,5,4,5,6,7,6,7,8,7,7,6,4,5,6,5,6,4,7,4,5,5,6,5,5,5,5,6,5,6,4,5,7,5,4,5,6,5,6,3,4,5,6,6,6,6,6,5,4,4,5,4,6,5,6,5,7,6,5,6,4,7,5,3,5,6,4,5,4,5,5,6,4,5,6,7,6,7,5,4,4,7,6,7,5,7,6,16,13,9,3,6,4,4,2,3,6,3,3,4,4,4,4,6,6,7,7,7,7,4,2,3,2,15,2,3,2,3,3,7,3,3,3,3,3,2,2,2,2,5,5,5,5,5,5,6,6,6,6,5,5,5,5,5,5,5,5,5,5,4,4,4,8,8,8,8,4,8,8,8,8,8,8,8,8,6,6,6,6,8,8,8,6,6,6,6,5,5,5,5,4,3,7,3,9,3,5,3,6,3,4,3,4,4,4,4,9,4,4,6,5,3,3,3,5,7,6,8,8,8,8,9,9,4,8,4,7,6,4,7,5,5,5,8,8,8,5,5,5,6,6,7,7,5,7,4,5,5,5,7,7,7,7,7,7,6,6,7,6,6,7,6,6,9,7,6,6,6,6,8,8,7,6,6,7,3,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,6,6,7,7,5,9,9,9,9,9,9,4,7,8,3,3,5,9,7,6,4,5,5,3,3,3,3,3,4,5,6,3,3,3,2,3,4,5,6,7,4,4,3,4,6,4,8,11,11,11,10,10,10,9,11,6,7,4,5,5,9,3,3,8,8,5,9,5,6,5,5,6,6,5,5,6,11,13,13,13,13,13,9,11,10,3,8,3,4,9,8,7,9,3,3,4,3,8,4,3,4,11,3,4,8,7,7,8,9,4,5,4,4,5,4,5,5,5,5,5,5,4,4,4,8,4,6,4,8,8,9,9,10,10,11,3,4,4,3,4,4,4,6,4,4,5,5,5,5,8,8,6,6,5,5,7,7,8,8,5,5,5,5,6,6,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,5,5,5,5,4,4,9,5,6,6,6,6,8,7,5,10,5,5,5,5,5,5,5,5,6,6,4,7,6,6,7,6,6,7,6,6,8,8,7,8,7,7,7,7,4,5,8,8,5,6,6,7,5,5,5,5,4,4,5,5,5,8,8,8,8,5,5,5,6,6,7,7,5,7,4,5,5,5,8,7,9,7,7,7,7,9,9,7,7,7,7,9,9,6,6,6,6,6,7,6,10,6,7,6,6,6,6,6,9,7,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,8,8,8,8,8,8,8,8,8,6,8,7,6,6,6,7,3,6,6,6,7,7,6,6,6,5,6,5,5,5,5,5,6,5,5,5,5,5,6,6,7,7,5,5,9,9,10,9,9,9,10,9,4,5,5,7,7,7,7,7,7,6,6,6,6,6,6,5,5,5,5,7,7,8,8,8,8,5,5,4,3,3,4,3,7,4,3,9,4,3,6,7,8,7,6,12,12,6,9,7,7,7,7,9,4,6,9,11,11,10,8,7,6,5,3,3,3,5,8,6,6,6,6,6,6,6,9,9,7,11,7,11,7,16,7,7,6,6,14,12,8,8,9,9,14,14,12,12,6,6,6,6,7,7,9,9,14,12,14,12,13,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,6,6,6,6,5,5,4,4,12,12,10,11,11,11,11,11,11,11,11,11,11,11,11,14,14,14,14,14,14,11,11,11,11,11,11,11,11,11,11,11,11,14,14,14,14,14,14,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,17,14,10,7,7,7,7,11,11,9,6,8,11,10,10,6,6,6,6,6,7,6,7,6,6,6,6,8,6,7,7,7,5,8,7,7,8,7,7,8,7,7,9,9,8,9,8,8,5,6,9,9,6,7,7,8,7,7,6,8,5,6,6,6,6,6,7,6,5,5,5,6,6,6,9,9,9,9,6,6,6,7,7,8,8,6,8,5,6,6,6,8,9,8,12,12,12,12,10,8,8,8,8,10,10,8,8,8,8,10,10,8,9,8,9,8,9,8,9,8,9,10,10,6,9,9,7,7,6,7,7,7,7,10,10,10,10,7,8,7,11,7,8,7,7,7,7,7,11,11,10,8,10,10,7,7,7,7,7,7,7,7,7,7,7,7,9,9,9,9,9,9,9,9,9,9,9,9,9,7,9,8,7,7,7,8,4,7,7,7,8,8,7,7,7,6,7,6,7,7,6,6,7,6,6,7,6,7,7,6,6,6,6,7,7,8,8,6,6,10,10,11,10,10,10,11,10,5,6,6,8,8,8,8,8,8,7,7,8,9,7,7,7,7,8,6,6,6,6,7,7,8,8,9,9,9,9,6,6,8,10,6,8,8,8,5,9,7,6,4,5,6,4,6,4,0,4,6,5,3,9,6,7,5,6,8,6,6,6,9,5 -#elif defined(FD_DECODE_TABLE_DEFINES) -#define FD_TABLE_OFFSET_32 0 -#define FD_TABLE_OFFSET_64 256 - -#else -#error "unspecified decode table" -#endif diff --git a/third_party/fadec/fadec-decode-public.inc b/third_party/fadec/fadec-decode-public.inc deleted file mode 100644 index 7b994ff..0000000 --- a/third_party/fadec/fadec-decode-public.inc +++ /dev/null @@ -1,1888 +0,0 @@ -FD_MNEMONIC(3DNOW,0) -FD_MNEMONIC(AAA,1) -FD_MNEMONIC(AAD,2) -FD_MNEMONIC(AADD,3) -FD_MNEMONIC(AAM,4) -FD_MNEMONIC(AAND,5) -FD_MNEMONIC(AAS,6) -FD_MNEMONIC(ADC,7) -FD_MNEMONIC(ADCX,8) -FD_MNEMONIC(ADD,9) -FD_MNEMONIC(ADOX,10) -FD_MNEMONIC(AESDEC,11) -FD_MNEMONIC(AESDEC128KL,12) -FD_MNEMONIC(AESDEC256KL,13) -FD_MNEMONIC(AESDECLAST,14) -FD_MNEMONIC(AESDECWIDE128KL,15) -FD_MNEMONIC(AESDECWIDE256KL,16) -FD_MNEMONIC(AESENC,17) -FD_MNEMONIC(AESENC128KL,18) -FD_MNEMONIC(AESENC256KL,19) -FD_MNEMONIC(AESENCLAST,20) -FD_MNEMONIC(AESENCWIDE128KL,21) -FD_MNEMONIC(AESENCWIDE256KL,22) -FD_MNEMONIC(AESIMC,23) -FD_MNEMONIC(AESKEYGENASSIST,24) -FD_MNEMONIC(AND,25) -FD_MNEMONIC(ANDN,26) -FD_MNEMONIC(AOR,27) -FD_MNEMONIC(ARPL,28) -FD_MNEMONIC(AXOR,29) -FD_MNEMONIC(BEXTR,30) -FD_MNEMONIC(BLSI,31) -FD_MNEMONIC(BLSMSK,32) -FD_MNEMONIC(BLSR,33) -FD_MNEMONIC(BOUND,34) -FD_MNEMONIC(BSF,35) -FD_MNEMONIC(BSR,36) -FD_MNEMONIC(BSWAP,37) -FD_MNEMONIC(BT,38) -FD_MNEMONIC(BTC,39) -FD_MNEMONIC(BTR,40) -FD_MNEMONIC(BTS,41) -FD_MNEMONIC(BZHI,42) -FD_MNEMONIC(CALL,43) -FD_MNEMONIC(CALLF,44) -FD_MNEMONIC(CLAC,45) -FD_MNEMONIC(CLC,46) -FD_MNEMONIC(CLD,47) -FD_MNEMONIC(CLDEMOTE,48) -FD_MNEMONIC(CLFLUSH,49) -FD_MNEMONIC(CLFLUSHOPT,50) -FD_MNEMONIC(CLGI,51) -FD_MNEMONIC(CLI,52) -FD_MNEMONIC(CLRSSBSY,53) -FD_MNEMONIC(CLTS,54) -FD_MNEMONIC(CLUI,55) -FD_MNEMONIC(CLWB,56) -FD_MNEMONIC(CLZERO,57) -FD_MNEMONIC(CMC,58) -FD_MNEMONIC(CMOVA,59) -FD_MNEMONIC(CMOVBE,60) -FD_MNEMONIC(CMOVC,61) -FD_MNEMONIC(CMOVG,62) -FD_MNEMONIC(CMOVGE,63) -FD_MNEMONIC(CMOVL,64) -FD_MNEMONIC(CMOVLE,65) -FD_MNEMONIC(CMOVNC,66) -FD_MNEMONIC(CMOVNO,67) -FD_MNEMONIC(CMOVNP,68) -FD_MNEMONIC(CMOVNS,69) -FD_MNEMONIC(CMOVNZ,70) -FD_MNEMONIC(CMOVO,71) -FD_MNEMONIC(CMOVP,72) -FD_MNEMONIC(CMOVS,73) -FD_MNEMONIC(CMOVZ,74) -FD_MNEMONIC(CMP,75) -FD_MNEMONIC(CMPBEXADD,76) -FD_MNEMONIC(CMPBXADD,77) -FD_MNEMONIC(CMPLEXADD,78) -FD_MNEMONIC(CMPLXADD,79) -FD_MNEMONIC(CMPNBEXADD,80) -FD_MNEMONIC(CMPNBXADD,81) -FD_MNEMONIC(CMPNLEXADD,82) -FD_MNEMONIC(CMPNLXADD,83) -FD_MNEMONIC(CMPNOXADD,84) -FD_MNEMONIC(CMPNPXADD,85) -FD_MNEMONIC(CMPNSXADD,86) -FD_MNEMONIC(CMPNZXADD,87) -FD_MNEMONIC(CMPOXADD,88) -FD_MNEMONIC(CMPPXADD,89) -FD_MNEMONIC(CMPS,90) -FD_MNEMONIC(CMPSXADD,91) -FD_MNEMONIC(CMPXCHG,92) -FD_MNEMONIC(CMPXCHGD,93) -FD_MNEMONIC(CMPZXADD,94) -FD_MNEMONIC(CPUID,95) -FD_MNEMONIC(CRC32,96) -FD_MNEMONIC(C_EX,97) -FD_MNEMONIC(C_SEP,98) -FD_MNEMONIC(DAA,99) -FD_MNEMONIC(DAS,100) -FD_MNEMONIC(DEC,101) -FD_MNEMONIC(DIV,102) -FD_MNEMONIC(ENCLS,103) -FD_MNEMONIC(ENCLU,104) -FD_MNEMONIC(ENCLV,105) -FD_MNEMONIC(ENCODEKEY128,106) -FD_MNEMONIC(ENCODEKEY256,107) -FD_MNEMONIC(ENDBR32,108) -FD_MNEMONIC(ENDBR64,109) -FD_MNEMONIC(ENQCMD,110) -FD_MNEMONIC(ENQCMDS,111) -FD_MNEMONIC(ENTER,112) -FD_MNEMONIC(ERETS,113) -FD_MNEMONIC(ERETU,114) -FD_MNEMONIC(EVX_ADDPD,115) -FD_MNEMONIC(EVX_ADDPH,116) -FD_MNEMONIC(EVX_ADDPS,117) -FD_MNEMONIC(EVX_ADDSD,118) -FD_MNEMONIC(EVX_ADDSH,119) -FD_MNEMONIC(EVX_ADDSS,120) -FD_MNEMONIC(EVX_AESDEC,121) -FD_MNEMONIC(EVX_AESDECLAST,122) -FD_MNEMONIC(EVX_AESENC,123) -FD_MNEMONIC(EVX_AESENCLAST,124) -FD_MNEMONIC(EVX_ALIGND,125) -FD_MNEMONIC(EVX_ALIGNQ,126) -FD_MNEMONIC(EVX_ANDNPD,127) -FD_MNEMONIC(EVX_ANDNPS,128) -FD_MNEMONIC(EVX_ANDPD,129) -FD_MNEMONIC(EVX_ANDPS,130) -FD_MNEMONIC(EVX_BLENDMPD,131) -FD_MNEMONIC(EVX_BLENDMPS,132) -FD_MNEMONIC(EVX_BROADCASTF32X2,133) -FD_MNEMONIC(EVX_BROADCASTF32X4,134) -FD_MNEMONIC(EVX_BROADCASTF32X8,135) -FD_MNEMONIC(EVX_BROADCASTF64X2,136) -FD_MNEMONIC(EVX_BROADCASTF64X4,137) -FD_MNEMONIC(EVX_BROADCASTI32X2,138) -FD_MNEMONIC(EVX_BROADCASTI32X4,139) -FD_MNEMONIC(EVX_BROADCASTI32X8,140) -FD_MNEMONIC(EVX_BROADCASTI64X2,141) -FD_MNEMONIC(EVX_BROADCASTI64X4,142) -FD_MNEMONIC(EVX_BROADCASTSD,143) -FD_MNEMONIC(EVX_BROADCASTSS,144) -FD_MNEMONIC(EVX_CMPPD,145) -FD_MNEMONIC(EVX_CMPPH,146) -FD_MNEMONIC(EVX_CMPPS,147) -FD_MNEMONIC(EVX_CMPSD,148) -FD_MNEMONIC(EVX_CMPSH,149) -FD_MNEMONIC(EVX_CMPSS,150) -FD_MNEMONIC(EVX_COMISD,151) -FD_MNEMONIC(EVX_COMISH,152) -FD_MNEMONIC(EVX_COMISS,153) -FD_MNEMONIC(EVX_COMPRESSPD,154) -FD_MNEMONIC(EVX_COMPRESSPS,155) -FD_MNEMONIC(EVX_CVTDQ2PD,156) -FD_MNEMONIC(EVX_CVTDQ2PH,157) -FD_MNEMONIC(EVX_CVTDQ2PS,158) -FD_MNEMONIC(EVX_CVTNE2PS2BF16,159) -FD_MNEMONIC(EVX_CVTNEPS2BF16,160) -FD_MNEMONIC(EVX_CVTPD2DQ,161) -FD_MNEMONIC(EVX_CVTPD2PH,162) -FD_MNEMONIC(EVX_CVTPD2PS,163) -FD_MNEMONIC(EVX_CVTPD2QQ,164) -FD_MNEMONIC(EVX_CVTPD2UDQ,165) -FD_MNEMONIC(EVX_CVTPD2UQQ,166) -FD_MNEMONIC(EVX_CVTPH2DQ,167) -FD_MNEMONIC(EVX_CVTPH2PD,168) -FD_MNEMONIC(EVX_CVTPH2PS,169) -FD_MNEMONIC(EVX_CVTPH2PSX,170) -FD_MNEMONIC(EVX_CVTPH2QQ,171) -FD_MNEMONIC(EVX_CVTPH2UDQ,172) -FD_MNEMONIC(EVX_CVTPH2UQQ,173) -FD_MNEMONIC(EVX_CVTPH2UW,174) -FD_MNEMONIC(EVX_CVTPH2W,175) -FD_MNEMONIC(EVX_CVTPS2DQ,176) -FD_MNEMONIC(EVX_CVTPS2PD,177) -FD_MNEMONIC(EVX_CVTPS2PH,178) -FD_MNEMONIC(EVX_CVTPS2PHX,179) -FD_MNEMONIC(EVX_CVTPS2QQ,180) -FD_MNEMONIC(EVX_CVTPS2UDQ,181) -FD_MNEMONIC(EVX_CVTPS2UQQ,182) -FD_MNEMONIC(EVX_CVTQQ2PD,183) -FD_MNEMONIC(EVX_CVTQQ2PH,184) -FD_MNEMONIC(EVX_CVTQQ2PS,185) -FD_MNEMONIC(EVX_CVTSD2SH,186) -FD_MNEMONIC(EVX_CVTSD2SI,187) -FD_MNEMONIC(EVX_CVTSD2SS,188) -FD_MNEMONIC(EVX_CVTSD2USI,189) -FD_MNEMONIC(EVX_CVTSH2SD,190) -FD_MNEMONIC(EVX_CVTSH2SI,191) -FD_MNEMONIC(EVX_CVTSH2SS,192) -FD_MNEMONIC(EVX_CVTSH2USI,193) -FD_MNEMONIC(EVX_CVTSI2SD,194) -FD_MNEMONIC(EVX_CVTSI2SH,195) -FD_MNEMONIC(EVX_CVTSI2SS,196) -FD_MNEMONIC(EVX_CVTSS2SD,197) -FD_MNEMONIC(EVX_CVTSS2SH,198) -FD_MNEMONIC(EVX_CVTSS2SI,199) -FD_MNEMONIC(EVX_CVTSS2USI,200) -FD_MNEMONIC(EVX_CVTTPD2DQ,201) -FD_MNEMONIC(EVX_CVTTPD2QQ,202) -FD_MNEMONIC(EVX_CVTTPD2UDQ,203) -FD_MNEMONIC(EVX_CVTTPD2UQQ,204) -FD_MNEMONIC(EVX_CVTTPH2DQ,205) -FD_MNEMONIC(EVX_CVTTPH2QQ,206) -FD_MNEMONIC(EVX_CVTTPH2UDQ,207) -FD_MNEMONIC(EVX_CVTTPH2UQQ,208) -FD_MNEMONIC(EVX_CVTTPH2UW,209) -FD_MNEMONIC(EVX_CVTTPH2W,210) -FD_MNEMONIC(EVX_CVTTPS2DQ,211) -FD_MNEMONIC(EVX_CVTTPS2QQ,212) -FD_MNEMONIC(EVX_CVTTPS2UDQ,213) -FD_MNEMONIC(EVX_CVTTPS2UQQ,214) -FD_MNEMONIC(EVX_CVTTSD2SI,215) -FD_MNEMONIC(EVX_CVTTSD2USI,216) -FD_MNEMONIC(EVX_CVTTSH2SI,217) -FD_MNEMONIC(EVX_CVTTSH2USI,218) -FD_MNEMONIC(EVX_CVTTSS2SI,219) -FD_MNEMONIC(EVX_CVTTSS2USI,220) -FD_MNEMONIC(EVX_CVTUDQ2PD,221) -FD_MNEMONIC(EVX_CVTUDQ2PH,222) -FD_MNEMONIC(EVX_CVTUDQ2PS,223) -FD_MNEMONIC(EVX_CVTUQQ2PD,224) -FD_MNEMONIC(EVX_CVTUQQ2PH,225) -FD_MNEMONIC(EVX_CVTUQQ2PS,226) -FD_MNEMONIC(EVX_CVTUSI2SD,227) -FD_MNEMONIC(EVX_CVTUSI2SH,228) -FD_MNEMONIC(EVX_CVTUSI2SS,229) -FD_MNEMONIC(EVX_CVTUW2PH,230) -FD_MNEMONIC(EVX_CVTW2PH,231) -FD_MNEMONIC(EVX_DBPSADBW,232) -FD_MNEMONIC(EVX_DIVPD,233) -FD_MNEMONIC(EVX_DIVPH,234) -FD_MNEMONIC(EVX_DIVPS,235) -FD_MNEMONIC(EVX_DIVSD,236) -FD_MNEMONIC(EVX_DIVSH,237) -FD_MNEMONIC(EVX_DIVSS,238) -FD_MNEMONIC(EVX_DPBF16PS,239) -FD_MNEMONIC(EVX_EXPANDPD,240) -FD_MNEMONIC(EVX_EXPANDPS,241) -FD_MNEMONIC(EVX_EXTRACTF32X4,242) -FD_MNEMONIC(EVX_EXTRACTF32X8,243) -FD_MNEMONIC(EVX_EXTRACTF64X2,244) -FD_MNEMONIC(EVX_EXTRACTF64X4,245) -FD_MNEMONIC(EVX_EXTRACTI32X4,246) -FD_MNEMONIC(EVX_EXTRACTI32X8,247) -FD_MNEMONIC(EVX_EXTRACTI64X2,248) -FD_MNEMONIC(EVX_EXTRACTI64X4,249) -FD_MNEMONIC(EVX_EXTRACTPS,250) -FD_MNEMONIC(EVX_FCMADDCPH,251) -FD_MNEMONIC(EVX_FCMADDCSH,252) -FD_MNEMONIC(EVX_FCMULCPH,253) -FD_MNEMONIC(EVX_FCMULCSH,254) -FD_MNEMONIC(EVX_FIXUPIMMPD,255) -FD_MNEMONIC(EVX_FIXUPIMMPS,256) -FD_MNEMONIC(EVX_FIXUPIMMSD,257) -FD_MNEMONIC(EVX_FIXUPIMMSS,258) -FD_MNEMONIC(EVX_FMADD132PD,259) -FD_MNEMONIC(EVX_FMADD132PH,260) -FD_MNEMONIC(EVX_FMADD132PS,261) -FD_MNEMONIC(EVX_FMADD132SD,262) -FD_MNEMONIC(EVX_FMADD132SH,263) -FD_MNEMONIC(EVX_FMADD132SS,264) -FD_MNEMONIC(EVX_FMADD213PD,265) -FD_MNEMONIC(EVX_FMADD213PH,266) -FD_MNEMONIC(EVX_FMADD213PS,267) -FD_MNEMONIC(EVX_FMADD213SD,268) -FD_MNEMONIC(EVX_FMADD213SH,269) -FD_MNEMONIC(EVX_FMADD213SS,270) -FD_MNEMONIC(EVX_FMADD231PD,271) -FD_MNEMONIC(EVX_FMADD231PH,272) -FD_MNEMONIC(EVX_FMADD231PS,273) -FD_MNEMONIC(EVX_FMADD231SD,274) -FD_MNEMONIC(EVX_FMADD231SH,275) -FD_MNEMONIC(EVX_FMADD231SS,276) -FD_MNEMONIC(EVX_FMADDCPH,277) -FD_MNEMONIC(EVX_FMADDCSH,278) -FD_MNEMONIC(EVX_FMADDSUB132PD,279) -FD_MNEMONIC(EVX_FMADDSUB132PH,280) -FD_MNEMONIC(EVX_FMADDSUB132PS,281) -FD_MNEMONIC(EVX_FMADDSUB213PD,282) -FD_MNEMONIC(EVX_FMADDSUB213PH,283) -FD_MNEMONIC(EVX_FMADDSUB213PS,284) -FD_MNEMONIC(EVX_FMADDSUB231PD,285) -FD_MNEMONIC(EVX_FMADDSUB231PH,286) -FD_MNEMONIC(EVX_FMADDSUB231PS,287) -FD_MNEMONIC(EVX_FMSUB132PD,288) -FD_MNEMONIC(EVX_FMSUB132PH,289) -FD_MNEMONIC(EVX_FMSUB132PS,290) -FD_MNEMONIC(EVX_FMSUB132SD,291) -FD_MNEMONIC(EVX_FMSUB132SH,292) -FD_MNEMONIC(EVX_FMSUB132SS,293) -FD_MNEMONIC(EVX_FMSUB213PD,294) -FD_MNEMONIC(EVX_FMSUB213PH,295) -FD_MNEMONIC(EVX_FMSUB213PS,296) -FD_MNEMONIC(EVX_FMSUB213SD,297) -FD_MNEMONIC(EVX_FMSUB213SH,298) -FD_MNEMONIC(EVX_FMSUB213SS,299) -FD_MNEMONIC(EVX_FMSUB231PD,300) -FD_MNEMONIC(EVX_FMSUB231PH,301) -FD_MNEMONIC(EVX_FMSUB231PS,302) -FD_MNEMONIC(EVX_FMSUB231SD,303) -FD_MNEMONIC(EVX_FMSUB231SH,304) -FD_MNEMONIC(EVX_FMSUB231SS,305) -FD_MNEMONIC(EVX_FMSUBADD132PD,306) -FD_MNEMONIC(EVX_FMSUBADD132PH,307) -FD_MNEMONIC(EVX_FMSUBADD132PS,308) -FD_MNEMONIC(EVX_FMSUBADD213PD,309) -FD_MNEMONIC(EVX_FMSUBADD213PH,310) -FD_MNEMONIC(EVX_FMSUBADD213PS,311) -FD_MNEMONIC(EVX_FMSUBADD231PD,312) -FD_MNEMONIC(EVX_FMSUBADD231PH,313) -FD_MNEMONIC(EVX_FMSUBADD231PS,314) -FD_MNEMONIC(EVX_FMULCPH,315) -FD_MNEMONIC(EVX_FMULCSH,316) -FD_MNEMONIC(EVX_FNMADD132PD,317) -FD_MNEMONIC(EVX_FNMADD132PH,318) -FD_MNEMONIC(EVX_FNMADD132PS,319) -FD_MNEMONIC(EVX_FNMADD132SD,320) -FD_MNEMONIC(EVX_FNMADD132SH,321) -FD_MNEMONIC(EVX_FNMADD132SS,322) -FD_MNEMONIC(EVX_FNMADD213PD,323) -FD_MNEMONIC(EVX_FNMADD213PH,324) -FD_MNEMONIC(EVX_FNMADD213PS,325) -FD_MNEMONIC(EVX_FNMADD213SD,326) -FD_MNEMONIC(EVX_FNMADD213SH,327) -FD_MNEMONIC(EVX_FNMADD213SS,328) -FD_MNEMONIC(EVX_FNMADD231PD,329) -FD_MNEMONIC(EVX_FNMADD231PH,330) -FD_MNEMONIC(EVX_FNMADD231PS,331) -FD_MNEMONIC(EVX_FNMADD231SD,332) -FD_MNEMONIC(EVX_FNMADD231SH,333) -FD_MNEMONIC(EVX_FNMADD231SS,334) -FD_MNEMONIC(EVX_FNMSUB132PD,335) -FD_MNEMONIC(EVX_FNMSUB132PH,336) -FD_MNEMONIC(EVX_FNMSUB132PS,337) -FD_MNEMONIC(EVX_FNMSUB132SD,338) -FD_MNEMONIC(EVX_FNMSUB132SH,339) -FD_MNEMONIC(EVX_FNMSUB132SS,340) -FD_MNEMONIC(EVX_FNMSUB213PD,341) -FD_MNEMONIC(EVX_FNMSUB213PH,342) -FD_MNEMONIC(EVX_FNMSUB213PS,343) -FD_MNEMONIC(EVX_FNMSUB213SD,344) -FD_MNEMONIC(EVX_FNMSUB213SH,345) -FD_MNEMONIC(EVX_FNMSUB213SS,346) -FD_MNEMONIC(EVX_FNMSUB231PD,347) -FD_MNEMONIC(EVX_FNMSUB231PH,348) -FD_MNEMONIC(EVX_FNMSUB231PS,349) -FD_MNEMONIC(EVX_FNMSUB231SD,350) -FD_MNEMONIC(EVX_FNMSUB231SH,351) -FD_MNEMONIC(EVX_FNMSUB231SS,352) -FD_MNEMONIC(EVX_FPCLASSPD,353) -FD_MNEMONIC(EVX_FPCLASSPH,354) -FD_MNEMONIC(EVX_FPCLASSPS,355) -FD_MNEMONIC(EVX_FPCLASSSD,356) -FD_MNEMONIC(EVX_FPCLASSSH,357) -FD_MNEMONIC(EVX_FPCLASSSS,358) -FD_MNEMONIC(EVX_GATHERDPD,359) -FD_MNEMONIC(EVX_GATHERDPS,360) -FD_MNEMONIC(EVX_GATHERQPD,361) -FD_MNEMONIC(EVX_GATHERQPS,362) -FD_MNEMONIC(EVX_GETEXPPD,363) -FD_MNEMONIC(EVX_GETEXPPH,364) -FD_MNEMONIC(EVX_GETEXPPS,365) -FD_MNEMONIC(EVX_GETEXPSD,366) -FD_MNEMONIC(EVX_GETEXPSH,367) -FD_MNEMONIC(EVX_GETEXPSS,368) -FD_MNEMONIC(EVX_GETMANTPD,369) -FD_MNEMONIC(EVX_GETMANTPH,370) -FD_MNEMONIC(EVX_GETMANTPS,371) -FD_MNEMONIC(EVX_GETMANTSD,372) -FD_MNEMONIC(EVX_GETMANTSH,373) -FD_MNEMONIC(EVX_GETMANTSS,374) -FD_MNEMONIC(EVX_GF2P8AFFINEINVQB,375) -FD_MNEMONIC(EVX_GF2P8AFFINEQB,376) -FD_MNEMONIC(EVX_GF2P8MULB,377) -FD_MNEMONIC(EVX_INSERTF32X4,378) -FD_MNEMONIC(EVX_INSERTF32X8,379) -FD_MNEMONIC(EVX_INSERTF64X2,380) -FD_MNEMONIC(EVX_INSERTF64X4,381) -FD_MNEMONIC(EVX_INSERTI32X4,382) -FD_MNEMONIC(EVX_INSERTI32X8,383) -FD_MNEMONIC(EVX_INSERTI64X2,384) -FD_MNEMONIC(EVX_INSERTI64X4,385) -FD_MNEMONIC(EVX_INSERTPS,386) -FD_MNEMONIC(EVX_MAXPD,387) -FD_MNEMONIC(EVX_MAXPH,388) -FD_MNEMONIC(EVX_MAXPS,389) -FD_MNEMONIC(EVX_MAXSD,390) -FD_MNEMONIC(EVX_MAXSH,391) -FD_MNEMONIC(EVX_MAXSS,392) -FD_MNEMONIC(EVX_MINPD,393) -FD_MNEMONIC(EVX_MINPH,394) -FD_MNEMONIC(EVX_MINPS,395) -FD_MNEMONIC(EVX_MINSD,396) -FD_MNEMONIC(EVX_MINSH,397) -FD_MNEMONIC(EVX_MINSS,398) -FD_MNEMONIC(EVX_MOVAPD,399) -FD_MNEMONIC(EVX_MOVAPS,400) -FD_MNEMONIC(EVX_MOVDDUP,401) -FD_MNEMONIC(EVX_MOVDQA32,402) -FD_MNEMONIC(EVX_MOVDQA64,403) -FD_MNEMONIC(EVX_MOVDQU16,404) -FD_MNEMONIC(EVX_MOVDQU32,405) -FD_MNEMONIC(EVX_MOVDQU64,406) -FD_MNEMONIC(EVX_MOVDQU8,407) -FD_MNEMONIC(EVX_MOVHLPS,408) -FD_MNEMONIC(EVX_MOVHPD,409) -FD_MNEMONIC(EVX_MOVHPS,410) -FD_MNEMONIC(EVX_MOVLHPS,411) -FD_MNEMONIC(EVX_MOVLPD,412) -FD_MNEMONIC(EVX_MOVLPS,413) -FD_MNEMONIC(EVX_MOVNTDQ,414) -FD_MNEMONIC(EVX_MOVNTDQA,415) -FD_MNEMONIC(EVX_MOVNTPD,416) -FD_MNEMONIC(EVX_MOVNTPS,417) -FD_MNEMONIC(EVX_MOVQ,418) -FD_MNEMONIC(EVX_MOVSD,419) -FD_MNEMONIC(EVX_MOVSH,420) -FD_MNEMONIC(EVX_MOVSHDUP,421) -FD_MNEMONIC(EVX_MOVSLDUP,422) -FD_MNEMONIC(EVX_MOVSS,423) -FD_MNEMONIC(EVX_MOVUPD,424) -FD_MNEMONIC(EVX_MOVUPS,425) -FD_MNEMONIC(EVX_MOVW_G2X,426) -FD_MNEMONIC(EVX_MOVW_X2G,427) -FD_MNEMONIC(EVX_MOV_G2X,428) -FD_MNEMONIC(EVX_MOV_X2G,429) -FD_MNEMONIC(EVX_MULPD,430) -FD_MNEMONIC(EVX_MULPH,431) -FD_MNEMONIC(EVX_MULPS,432) -FD_MNEMONIC(EVX_MULSD,433) -FD_MNEMONIC(EVX_MULSH,434) -FD_MNEMONIC(EVX_MULSS,435) -FD_MNEMONIC(EVX_ORPD,436) -FD_MNEMONIC(EVX_ORPS,437) -FD_MNEMONIC(EVX_P2INTERSECTD,438) -FD_MNEMONIC(EVX_P2INTERSECTQ,439) -FD_MNEMONIC(EVX_PABSB,440) -FD_MNEMONIC(EVX_PABSD,441) -FD_MNEMONIC(EVX_PABSQ,442) -FD_MNEMONIC(EVX_PABSW,443) -FD_MNEMONIC(EVX_PACKSSDW,444) -FD_MNEMONIC(EVX_PACKSSWB,445) -FD_MNEMONIC(EVX_PACKUSDW,446) -FD_MNEMONIC(EVX_PACKUSWB,447) -FD_MNEMONIC(EVX_PADDB,448) -FD_MNEMONIC(EVX_PADDD,449) -FD_MNEMONIC(EVX_PADDQ,450) -FD_MNEMONIC(EVX_PADDSB,451) -FD_MNEMONIC(EVX_PADDSW,452) -FD_MNEMONIC(EVX_PADDUSB,453) -FD_MNEMONIC(EVX_PADDUSW,454) -FD_MNEMONIC(EVX_PADDW,455) -FD_MNEMONIC(EVX_PALIGNR,456) -FD_MNEMONIC(EVX_PANDD,457) -FD_MNEMONIC(EVX_PANDND,458) -FD_MNEMONIC(EVX_PANDNQ,459) -FD_MNEMONIC(EVX_PANDQ,460) -FD_MNEMONIC(EVX_PAVGB,461) -FD_MNEMONIC(EVX_PAVGW,462) -FD_MNEMONIC(EVX_PBLENDMB,463) -FD_MNEMONIC(EVX_PBLENDMD,464) -FD_MNEMONIC(EVX_PBLENDMQ,465) -FD_MNEMONIC(EVX_PBLENDMW,466) -FD_MNEMONIC(EVX_PBROADCAST,467) -FD_MNEMONIC(EVX_PBROADCASTB,468) -FD_MNEMONIC(EVX_PBROADCASTD,469) -FD_MNEMONIC(EVX_PBROADCASTMB2Q,470) -FD_MNEMONIC(EVX_PBROADCASTMW2D,471) -FD_MNEMONIC(EVX_PBROADCASTQ,472) -FD_MNEMONIC(EVX_PBROADCASTW,473) -FD_MNEMONIC(EVX_PCLMULQDQ,474) -FD_MNEMONIC(EVX_PCMPB,475) -FD_MNEMONIC(EVX_PCMPD,476) -FD_MNEMONIC(EVX_PCMPEQB,477) -FD_MNEMONIC(EVX_PCMPEQD,478) -FD_MNEMONIC(EVX_PCMPEQQ,479) -FD_MNEMONIC(EVX_PCMPEQW,480) -FD_MNEMONIC(EVX_PCMPGTB,481) -FD_MNEMONIC(EVX_PCMPGTD,482) -FD_MNEMONIC(EVX_PCMPGTQ,483) -FD_MNEMONIC(EVX_PCMPGTW,484) -FD_MNEMONIC(EVX_PCMPQ,485) -FD_MNEMONIC(EVX_PCMPUB,486) -FD_MNEMONIC(EVX_PCMPUD,487) -FD_MNEMONIC(EVX_PCMPUQ,488) -FD_MNEMONIC(EVX_PCMPUW,489) -FD_MNEMONIC(EVX_PCMPW,490) -FD_MNEMONIC(EVX_PCOMPRESSB,491) -FD_MNEMONIC(EVX_PCOMPRESSD,492) -FD_MNEMONIC(EVX_PCOMPRESSQ,493) -FD_MNEMONIC(EVX_PCOMPRESSW,494) -FD_MNEMONIC(EVX_PCONFLICTD,495) -FD_MNEMONIC(EVX_PCONFLICTQ,496) -FD_MNEMONIC(EVX_PDPBUSD,497) -FD_MNEMONIC(EVX_PDPBUSDS,498) -FD_MNEMONIC(EVX_PDPWSSD,499) -FD_MNEMONIC(EVX_PDPWSSDS,500) -FD_MNEMONIC(EVX_PERMB,501) -FD_MNEMONIC(EVX_PERMD,502) -FD_MNEMONIC(EVX_PERMI2B,503) -FD_MNEMONIC(EVX_PERMI2D,504) -FD_MNEMONIC(EVX_PERMI2PD,505) -FD_MNEMONIC(EVX_PERMI2PS,506) -FD_MNEMONIC(EVX_PERMI2Q,507) -FD_MNEMONIC(EVX_PERMI2W,508) -FD_MNEMONIC(EVX_PERMILPD,509) -FD_MNEMONIC(EVX_PERMILPS,510) -FD_MNEMONIC(EVX_PERMPD,511) -FD_MNEMONIC(EVX_PERMPS,512) -FD_MNEMONIC(EVX_PERMQ,513) -FD_MNEMONIC(EVX_PERMT2B,514) -FD_MNEMONIC(EVX_PERMT2D,515) -FD_MNEMONIC(EVX_PERMT2PD,516) -FD_MNEMONIC(EVX_PERMT2PS,517) -FD_MNEMONIC(EVX_PERMT2Q,518) -FD_MNEMONIC(EVX_PERMT2W,519) -FD_MNEMONIC(EVX_PERMW,520) -FD_MNEMONIC(EVX_PEXPANDB,521) -FD_MNEMONIC(EVX_PEXPANDD,522) -FD_MNEMONIC(EVX_PEXPANDQ,523) -FD_MNEMONIC(EVX_PEXPANDW,524) -FD_MNEMONIC(EVX_PEXTR,525) -FD_MNEMONIC(EVX_PEXTRB,526) -FD_MNEMONIC(EVX_PEXTRW,527) -FD_MNEMONIC(EVX_PGATHERDD,528) -FD_MNEMONIC(EVX_PGATHERDQ,529) -FD_MNEMONIC(EVX_PGATHERQD,530) -FD_MNEMONIC(EVX_PGATHERQQ,531) -FD_MNEMONIC(EVX_PINSR,532) -FD_MNEMONIC(EVX_PLZCNTD,533) -FD_MNEMONIC(EVX_PLZCNTQ,534) -FD_MNEMONIC(EVX_PMADD52HUQ,535) -FD_MNEMONIC(EVX_PMADD52LUQ,536) -FD_MNEMONIC(EVX_PMADDUBSW,537) -FD_MNEMONIC(EVX_PMADDWD,538) -FD_MNEMONIC(EVX_PMAXSB,539) -FD_MNEMONIC(EVX_PMAXSD,540) -FD_MNEMONIC(EVX_PMAXSQ,541) -FD_MNEMONIC(EVX_PMAXSW,542) -FD_MNEMONIC(EVX_PMAXUB,543) -FD_MNEMONIC(EVX_PMAXUD,544) -FD_MNEMONIC(EVX_PMAXUQ,545) -FD_MNEMONIC(EVX_PMAXUW,546) -FD_MNEMONIC(EVX_PMINSB,547) -FD_MNEMONIC(EVX_PMINSD,548) -FD_MNEMONIC(EVX_PMINSQ,549) -FD_MNEMONIC(EVX_PMINSW,550) -FD_MNEMONIC(EVX_PMINUB,551) -FD_MNEMONIC(EVX_PMINUD,552) -FD_MNEMONIC(EVX_PMINUQ,553) -FD_MNEMONIC(EVX_PMINUW,554) -FD_MNEMONIC(EVX_PMOVB2M,555) -FD_MNEMONIC(EVX_PMOVD2M,556) -FD_MNEMONIC(EVX_PMOVDB,557) -FD_MNEMONIC(EVX_PMOVDW,558) -FD_MNEMONIC(EVX_PMOVM2B,559) -FD_MNEMONIC(EVX_PMOVM2D,560) -FD_MNEMONIC(EVX_PMOVM2Q,561) -FD_MNEMONIC(EVX_PMOVM2W,562) -FD_MNEMONIC(EVX_PMOVQ2M,563) -FD_MNEMONIC(EVX_PMOVQB,564) -FD_MNEMONIC(EVX_PMOVQD,565) -FD_MNEMONIC(EVX_PMOVQW,566) -FD_MNEMONIC(EVX_PMOVSDB,567) -FD_MNEMONIC(EVX_PMOVSDW,568) -FD_MNEMONIC(EVX_PMOVSQB,569) -FD_MNEMONIC(EVX_PMOVSQD,570) -FD_MNEMONIC(EVX_PMOVSQW,571) -FD_MNEMONIC(EVX_PMOVSWB,572) -FD_MNEMONIC(EVX_PMOVSXBD,573) -FD_MNEMONIC(EVX_PMOVSXBQ,574) -FD_MNEMONIC(EVX_PMOVSXBW,575) -FD_MNEMONIC(EVX_PMOVSXDQ,576) -FD_MNEMONIC(EVX_PMOVSXWD,577) -FD_MNEMONIC(EVX_PMOVSXWQ,578) -FD_MNEMONIC(EVX_PMOVUSDB,579) -FD_MNEMONIC(EVX_PMOVUSDW,580) -FD_MNEMONIC(EVX_PMOVUSQB,581) -FD_MNEMONIC(EVX_PMOVUSQD,582) -FD_MNEMONIC(EVX_PMOVUSQW,583) -FD_MNEMONIC(EVX_PMOVUSWB,584) -FD_MNEMONIC(EVX_PMOVW2M,585) -FD_MNEMONIC(EVX_PMOVWB,586) -FD_MNEMONIC(EVX_PMOVZXBD,587) -FD_MNEMONIC(EVX_PMOVZXBQ,588) -FD_MNEMONIC(EVX_PMOVZXBW,589) -FD_MNEMONIC(EVX_PMOVZXDQ,590) -FD_MNEMONIC(EVX_PMOVZXWD,591) -FD_MNEMONIC(EVX_PMOVZXWQ,592) -FD_MNEMONIC(EVX_PMULDQ,593) -FD_MNEMONIC(EVX_PMULHRSW,594) -FD_MNEMONIC(EVX_PMULHUW,595) -FD_MNEMONIC(EVX_PMULHW,596) -FD_MNEMONIC(EVX_PMULLD,597) -FD_MNEMONIC(EVX_PMULLQ,598) -FD_MNEMONIC(EVX_PMULLW,599) -FD_MNEMONIC(EVX_PMULTISHIFTQB,600) -FD_MNEMONIC(EVX_PMULUDQ,601) -FD_MNEMONIC(EVX_POPCNTB,602) -FD_MNEMONIC(EVX_POPCNTD,603) -FD_MNEMONIC(EVX_POPCNTQ,604) -FD_MNEMONIC(EVX_POPCNTW,605) -FD_MNEMONIC(EVX_PORD,606) -FD_MNEMONIC(EVX_PORQ,607) -FD_MNEMONIC(EVX_PROLD,608) -FD_MNEMONIC(EVX_PROLQ,609) -FD_MNEMONIC(EVX_PROLVD,610) -FD_MNEMONIC(EVX_PROLVQ,611) -FD_MNEMONIC(EVX_PRORD,612) -FD_MNEMONIC(EVX_PRORQ,613) -FD_MNEMONIC(EVX_PRORVD,614) -FD_MNEMONIC(EVX_PRORVQ,615) -FD_MNEMONIC(EVX_PSADBW,616) -FD_MNEMONIC(EVX_PSCATTERDD,617) -FD_MNEMONIC(EVX_PSCATTERDQ,618) -FD_MNEMONIC(EVX_PSCATTERQD,619) -FD_MNEMONIC(EVX_PSCATTERQQ,620) -FD_MNEMONIC(EVX_PSHLDD,621) -FD_MNEMONIC(EVX_PSHLDQ,622) -FD_MNEMONIC(EVX_PSHLDVD,623) -FD_MNEMONIC(EVX_PSHLDVQ,624) -FD_MNEMONIC(EVX_PSHLDVW,625) -FD_MNEMONIC(EVX_PSHLDW,626) -FD_MNEMONIC(EVX_PSHRDD,627) -FD_MNEMONIC(EVX_PSHRDQ,628) -FD_MNEMONIC(EVX_PSHRDVD,629) -FD_MNEMONIC(EVX_PSHRDVQ,630) -FD_MNEMONIC(EVX_PSHRDVW,631) -FD_MNEMONIC(EVX_PSHRDW,632) -FD_MNEMONIC(EVX_PSHUFB,633) -FD_MNEMONIC(EVX_PSHUFBITQMB,634) -FD_MNEMONIC(EVX_PSHUFD,635) -FD_MNEMONIC(EVX_PSHUFHW,636) -FD_MNEMONIC(EVX_PSHUFLW,637) -FD_MNEMONIC(EVX_PSLLD,638) -FD_MNEMONIC(EVX_PSLLDQ,639) -FD_MNEMONIC(EVX_PSLLQ,640) -FD_MNEMONIC(EVX_PSLLVD,641) -FD_MNEMONIC(EVX_PSLLVQ,642) -FD_MNEMONIC(EVX_PSLLVW,643) -FD_MNEMONIC(EVX_PSLLW,644) -FD_MNEMONIC(EVX_PSRAD,645) -FD_MNEMONIC(EVX_PSRAQ,646) -FD_MNEMONIC(EVX_PSRAVD,647) -FD_MNEMONIC(EVX_PSRAVQ,648) -FD_MNEMONIC(EVX_PSRAVW,649) -FD_MNEMONIC(EVX_PSRAW,650) -FD_MNEMONIC(EVX_PSRLD,651) -FD_MNEMONIC(EVX_PSRLDQ,652) -FD_MNEMONIC(EVX_PSRLQ,653) -FD_MNEMONIC(EVX_PSRLVD,654) -FD_MNEMONIC(EVX_PSRLVQ,655) -FD_MNEMONIC(EVX_PSRLVW,656) -FD_MNEMONIC(EVX_PSRLW,657) -FD_MNEMONIC(EVX_PSUBB,658) -FD_MNEMONIC(EVX_PSUBD,659) -FD_MNEMONIC(EVX_PSUBQ,660) -FD_MNEMONIC(EVX_PSUBSB,661) -FD_MNEMONIC(EVX_PSUBSW,662) -FD_MNEMONIC(EVX_PSUBUSB,663) -FD_MNEMONIC(EVX_PSUBUSW,664) -FD_MNEMONIC(EVX_PSUBW,665) -FD_MNEMONIC(EVX_PTERNLOGD,666) -FD_MNEMONIC(EVX_PTERNLOGQ,667) -FD_MNEMONIC(EVX_PTESTMB,668) -FD_MNEMONIC(EVX_PTESTMD,669) -FD_MNEMONIC(EVX_PTESTMQ,670) -FD_MNEMONIC(EVX_PTESTMW,671) -FD_MNEMONIC(EVX_PTESTNMB,672) -FD_MNEMONIC(EVX_PTESTNMD,673) -FD_MNEMONIC(EVX_PTESTNMQ,674) -FD_MNEMONIC(EVX_PTESTNMW,675) -FD_MNEMONIC(EVX_PUNPCKHBW,676) -FD_MNEMONIC(EVX_PUNPCKHDQ,677) -FD_MNEMONIC(EVX_PUNPCKHQDQ,678) -FD_MNEMONIC(EVX_PUNPCKHWD,679) -FD_MNEMONIC(EVX_PUNPCKLBW,680) -FD_MNEMONIC(EVX_PUNPCKLDQ,681) -FD_MNEMONIC(EVX_PUNPCKLQDQ,682) -FD_MNEMONIC(EVX_PUNPCKLWD,683) -FD_MNEMONIC(EVX_PXORD,684) -FD_MNEMONIC(EVX_PXORQ,685) -FD_MNEMONIC(EVX_RANGEPD,686) -FD_MNEMONIC(EVX_RANGEPS,687) -FD_MNEMONIC(EVX_RANGESD,688) -FD_MNEMONIC(EVX_RANGESS,689) -FD_MNEMONIC(EVX_RCP14PD,690) -FD_MNEMONIC(EVX_RCP14PS,691) -FD_MNEMONIC(EVX_RCP14SD,692) -FD_MNEMONIC(EVX_RCP14SS,693) -FD_MNEMONIC(EVX_RCPPH,694) -FD_MNEMONIC(EVX_RCPSH,695) -FD_MNEMONIC(EVX_REDUCEPD,696) -FD_MNEMONIC(EVX_REDUCEPH,697) -FD_MNEMONIC(EVX_REDUCEPS,698) -FD_MNEMONIC(EVX_REDUCESD,699) -FD_MNEMONIC(EVX_REDUCESH,700) -FD_MNEMONIC(EVX_REDUCESS,701) -FD_MNEMONIC(EVX_RNDSCALEPD,702) -FD_MNEMONIC(EVX_RNDSCALEPH,703) -FD_MNEMONIC(EVX_RNDSCALEPS,704) -FD_MNEMONIC(EVX_RNDSCALESD,705) -FD_MNEMONIC(EVX_RNDSCALESH,706) -FD_MNEMONIC(EVX_RNDSCALESS,707) -FD_MNEMONIC(EVX_RSQRT14PD,708) -FD_MNEMONIC(EVX_RSQRT14PS,709) -FD_MNEMONIC(EVX_RSQRT14SD,710) -FD_MNEMONIC(EVX_RSQRT14SS,711) -FD_MNEMONIC(EVX_RSQRTPH,712) -FD_MNEMONIC(EVX_RSQRTSH,713) -FD_MNEMONIC(EVX_SCALEFPD,714) -FD_MNEMONIC(EVX_SCALEFPH,715) -FD_MNEMONIC(EVX_SCALEFPS,716) -FD_MNEMONIC(EVX_SCALEFSD,717) -FD_MNEMONIC(EVX_SCALEFSH,718) -FD_MNEMONIC(EVX_SCALEFSS,719) -FD_MNEMONIC(EVX_SCATTERDPD,720) -FD_MNEMONIC(EVX_SCATTERDPS,721) -FD_MNEMONIC(EVX_SCATTERQPD,722) -FD_MNEMONIC(EVX_SCATTERQPS,723) -FD_MNEMONIC(EVX_SHUFF32X4,724) -FD_MNEMONIC(EVX_SHUFF64X2,725) -FD_MNEMONIC(EVX_SHUFI32X4,726) -FD_MNEMONIC(EVX_SHUFI64X2,727) -FD_MNEMONIC(EVX_SHUFPD,728) -FD_MNEMONIC(EVX_SHUFPS,729) -FD_MNEMONIC(EVX_SQRTPD,730) -FD_MNEMONIC(EVX_SQRTPH,731) -FD_MNEMONIC(EVX_SQRTPS,732) -FD_MNEMONIC(EVX_SQRTSD,733) -FD_MNEMONIC(EVX_SQRTSH,734) -FD_MNEMONIC(EVX_SQRTSS,735) -FD_MNEMONIC(EVX_SUBPD,736) -FD_MNEMONIC(EVX_SUBPH,737) -FD_MNEMONIC(EVX_SUBPS,738) -FD_MNEMONIC(EVX_SUBSD,739) -FD_MNEMONIC(EVX_SUBSH,740) -FD_MNEMONIC(EVX_SUBSS,741) -FD_MNEMONIC(EVX_UCOMISD,742) -FD_MNEMONIC(EVX_UCOMISH,743) -FD_MNEMONIC(EVX_UCOMISS,744) -FD_MNEMONIC(EVX_UNPCKHPD,745) -FD_MNEMONIC(EVX_UNPCKHPS,746) -FD_MNEMONIC(EVX_UNPCKLPD,747) -FD_MNEMONIC(EVX_UNPCKLPS,748) -FD_MNEMONIC(EVX_XORPD,749) -FD_MNEMONIC(EVX_XORPS,750) -FD_MNEMONIC(F2XM1,751) -FD_MNEMONIC(FABS,752) -FD_MNEMONIC(FADD,753) -FD_MNEMONIC(FADDP,754) -FD_MNEMONIC(FBLD,755) -FD_MNEMONIC(FBSTP,756) -FD_MNEMONIC(FCHS,757) -FD_MNEMONIC(FCLEX,758) -FD_MNEMONIC(FCMOVB,759) -FD_MNEMONIC(FCMOVBE,760) -FD_MNEMONIC(FCMOVE,761) -FD_MNEMONIC(FCMOVNB,762) -FD_MNEMONIC(FCMOVNBE,763) -FD_MNEMONIC(FCMOVNE,764) -FD_MNEMONIC(FCMOVNU,765) -FD_MNEMONIC(FCMOVU,766) -FD_MNEMONIC(FCOM,767) -FD_MNEMONIC(FCOMI,768) -FD_MNEMONIC(FCOMIP,769) -FD_MNEMONIC(FCOMP,770) -FD_MNEMONIC(FCOMPP,771) -FD_MNEMONIC(FCOS,772) -FD_MNEMONIC(FDECSTP,773) -FD_MNEMONIC(FDIV,774) -FD_MNEMONIC(FDIVP,775) -FD_MNEMONIC(FDIVR,776) -FD_MNEMONIC(FDIVRP,777) -FD_MNEMONIC(FEMMS,778) -FD_MNEMONIC(FFREE,779) -FD_MNEMONIC(FIADD,780) -FD_MNEMONIC(FICOM,781) -FD_MNEMONIC(FICOMP,782) -FD_MNEMONIC(FIDIV,783) -FD_MNEMONIC(FIDIVR,784) -FD_MNEMONIC(FILD,785) -FD_MNEMONIC(FIMUL,786) -FD_MNEMONIC(FINCSTP,787) -FD_MNEMONIC(FINIT,788) -FD_MNEMONIC(FIST,789) -FD_MNEMONIC(FISTP,790) -FD_MNEMONIC(FISTTP,791) -FD_MNEMONIC(FISUB,792) -FD_MNEMONIC(FISUBR,793) -FD_MNEMONIC(FLD,794) -FD_MNEMONIC(FLD1,795) -FD_MNEMONIC(FLDCW,796) -FD_MNEMONIC(FLDENV,797) -FD_MNEMONIC(FLDL2E,798) -FD_MNEMONIC(FLDL2T,799) -FD_MNEMONIC(FLDLG2,800) -FD_MNEMONIC(FLDLN2,801) -FD_MNEMONIC(FLDPI,802) -FD_MNEMONIC(FLDZ,803) -FD_MNEMONIC(FMUL,804) -FD_MNEMONIC(FMULP,805) -FD_MNEMONIC(FNOP,806) -FD_MNEMONIC(FPATAN,807) -FD_MNEMONIC(FPREM,808) -FD_MNEMONIC(FPREM1,809) -FD_MNEMONIC(FPTAN,810) -FD_MNEMONIC(FRNDINT,811) -FD_MNEMONIC(FRSTOR,812) -FD_MNEMONIC(FSAVE,813) -FD_MNEMONIC(FSCALE,814) -FD_MNEMONIC(FSIN,815) -FD_MNEMONIC(FSINCOS,816) -FD_MNEMONIC(FSQRT,817) -FD_MNEMONIC(FST,818) -FD_MNEMONIC(FSTCW,819) -FD_MNEMONIC(FSTENV,820) -FD_MNEMONIC(FSTP,821) -FD_MNEMONIC(FSTSW,822) -FD_MNEMONIC(FSUB,823) -FD_MNEMONIC(FSUBP,824) -FD_MNEMONIC(FSUBR,825) -FD_MNEMONIC(FSUBRP,826) -FD_MNEMONIC(FTST,827) -FD_MNEMONIC(FUCOM,828) -FD_MNEMONIC(FUCOMI,829) -FD_MNEMONIC(FUCOMIP,830) -FD_MNEMONIC(FUCOMP,831) -FD_MNEMONIC(FUCOMPP,832) -FD_MNEMONIC(FWAIT,833) -FD_MNEMONIC(FXAM,834) -FD_MNEMONIC(FXCH,835) -FD_MNEMONIC(FXRSTOR,836) -FD_MNEMONIC(FXSAVE,837) -FD_MNEMONIC(FXTRACT,838) -FD_MNEMONIC(FYL2X,839) -FD_MNEMONIC(FYL2XP1,840) -FD_MNEMONIC(GETSEC,841) -FD_MNEMONIC(GF2P8AFFINEINVQB,842) -FD_MNEMONIC(GF2P8AFFINEQB,843) -FD_MNEMONIC(GF2P8MULB,844) -FD_MNEMONIC(HLT,845) -FD_MNEMONIC(HRESET,846) -FD_MNEMONIC(IDIV,847) -FD_MNEMONIC(IMUL,848) -FD_MNEMONIC(IN,849) -FD_MNEMONIC(INC,850) -FD_MNEMONIC(INCSSP,851) -FD_MNEMONIC(INS,852) -FD_MNEMONIC(INT,853) -FD_MNEMONIC(INT1,854) -FD_MNEMONIC(INT3,855) -FD_MNEMONIC(INTO,856) -FD_MNEMONIC(INVD,857) -FD_MNEMONIC(INVEPT,858) -FD_MNEMONIC(INVLPG,859) -FD_MNEMONIC(INVLPGA,860) -FD_MNEMONIC(INVLPGB,861) -FD_MNEMONIC(INVPCID,862) -FD_MNEMONIC(INVVPID,863) -FD_MNEMONIC(IRET,864) -FD_MNEMONIC(JA,865) -FD_MNEMONIC(JBE,866) -FD_MNEMONIC(JC,867) -FD_MNEMONIC(JCXZ,868) -FD_MNEMONIC(JG,869) -FD_MNEMONIC(JGE,870) -FD_MNEMONIC(JL,871) -FD_MNEMONIC(JLE,872) -FD_MNEMONIC(JMP,873) -FD_MNEMONIC(JMPF,874) -FD_MNEMONIC(JNC,875) -FD_MNEMONIC(JNO,876) -FD_MNEMONIC(JNP,877) -FD_MNEMONIC(JNS,878) -FD_MNEMONIC(JNZ,879) -FD_MNEMONIC(JO,880) -FD_MNEMONIC(JP,881) -FD_MNEMONIC(JS,882) -FD_MNEMONIC(JZ,883) -FD_MNEMONIC(KADDB,884) -FD_MNEMONIC(KADDD,885) -FD_MNEMONIC(KADDQ,886) -FD_MNEMONIC(KADDW,887) -FD_MNEMONIC(KANDB,888) -FD_MNEMONIC(KANDD,889) -FD_MNEMONIC(KANDNB,890) -FD_MNEMONIC(KANDND,891) -FD_MNEMONIC(KANDNQ,892) -FD_MNEMONIC(KANDNW,893) -FD_MNEMONIC(KANDQ,894) -FD_MNEMONIC(KANDW,895) -FD_MNEMONIC(KMOVB,896) -FD_MNEMONIC(KMOVD,897) -FD_MNEMONIC(KMOVQ,898) -FD_MNEMONIC(KMOVW,899) -FD_MNEMONIC(KNOTB,900) -FD_MNEMONIC(KNOTD,901) -FD_MNEMONIC(KNOTQ,902) -FD_MNEMONIC(KNOTW,903) -FD_MNEMONIC(KORB,904) -FD_MNEMONIC(KORD,905) -FD_MNEMONIC(KORQ,906) -FD_MNEMONIC(KORTESTB,907) -FD_MNEMONIC(KORTESTD,908) -FD_MNEMONIC(KORTESTQ,909) -FD_MNEMONIC(KORTESTW,910) -FD_MNEMONIC(KORW,911) -FD_MNEMONIC(KSHIFTLB,912) -FD_MNEMONIC(KSHIFTLD,913) -FD_MNEMONIC(KSHIFTLQ,914) -FD_MNEMONIC(KSHIFTLW,915) -FD_MNEMONIC(KSHIFTRB,916) -FD_MNEMONIC(KSHIFTRD,917) -FD_MNEMONIC(KSHIFTRQ,918) -FD_MNEMONIC(KSHIFTRW,919) -FD_MNEMONIC(KTESTB,920) -FD_MNEMONIC(KTESTD,921) -FD_MNEMONIC(KTESTQ,922) -FD_MNEMONIC(KTESTW,923) -FD_MNEMONIC(KUNPCKBW,924) -FD_MNEMONIC(KUNPCKDQ,925) -FD_MNEMONIC(KUNPCKWD,926) -FD_MNEMONIC(KXNORB,927) -FD_MNEMONIC(KXNORD,928) -FD_MNEMONIC(KXNORQ,929) -FD_MNEMONIC(KXNORW,930) -FD_MNEMONIC(KXORB,931) -FD_MNEMONIC(KXORD,932) -FD_MNEMONIC(KXORQ,933) -FD_MNEMONIC(KXORW,934) -FD_MNEMONIC(LAHF,935) -FD_MNEMONIC(LAR,936) -FD_MNEMONIC(LDMXCSR,937) -FD_MNEMONIC(LDS,938) -FD_MNEMONIC(LDTILECFG,939) -FD_MNEMONIC(LEA,940) -FD_MNEMONIC(LEAVE,941) -FD_MNEMONIC(LES,942) -FD_MNEMONIC(LFENCE,943) -FD_MNEMONIC(LFS,944) -FD_MNEMONIC(LGDT,945) -FD_MNEMONIC(LGS,946) -FD_MNEMONIC(LIDT,947) -FD_MNEMONIC(LKGS,948) -FD_MNEMONIC(LLDT,949) -FD_MNEMONIC(LMSW,950) -FD_MNEMONIC(LOADIWKEY,951) -FD_MNEMONIC(LODS,952) -FD_MNEMONIC(LOOP,953) -FD_MNEMONIC(LOOPNZ,954) -FD_MNEMONIC(LOOPZ,955) -FD_MNEMONIC(LSL,956) -FD_MNEMONIC(LSS,957) -FD_MNEMONIC(LTR,958) -FD_MNEMONIC(LZCNT,959) -FD_MNEMONIC(MCOMMIT,960) -FD_MNEMONIC(MFENCE,961) -FD_MNEMONIC(MMX_CVTPD2PI,962) -FD_MNEMONIC(MMX_CVTPI2PD,963) -FD_MNEMONIC(MMX_CVTPI2PS,964) -FD_MNEMONIC(MMX_CVTPS2PI,965) -FD_MNEMONIC(MMX_CVTTPD2PI,966) -FD_MNEMONIC(MMX_CVTTPS2PI,967) -FD_MNEMONIC(MMX_EMMS,968) -FD_MNEMONIC(MMX_MASKMOVQ,969) -FD_MNEMONIC(MMX_MOVD,970) -FD_MNEMONIC(MMX_MOVDQ2Q,971) -FD_MNEMONIC(MMX_MOVNTQ,972) -FD_MNEMONIC(MMX_MOVQ,973) -FD_MNEMONIC(MMX_MOVQ2DQ,974) -FD_MNEMONIC(MMX_PABSB,975) -FD_MNEMONIC(MMX_PABSD,976) -FD_MNEMONIC(MMX_PABSW,977) -FD_MNEMONIC(MMX_PACKSSDW,978) -FD_MNEMONIC(MMX_PACKSSWB,979) -FD_MNEMONIC(MMX_PACKUSWB,980) -FD_MNEMONIC(MMX_PADDB,981) -FD_MNEMONIC(MMX_PADDD,982) -FD_MNEMONIC(MMX_PADDQ,983) -FD_MNEMONIC(MMX_PADDSB,984) -FD_MNEMONIC(MMX_PADDSW,985) -FD_MNEMONIC(MMX_PADDUSB,986) -FD_MNEMONIC(MMX_PADDUSW,987) -FD_MNEMONIC(MMX_PADDW,988) -FD_MNEMONIC(MMX_PALIGNR,989) -FD_MNEMONIC(MMX_PAND,990) -FD_MNEMONIC(MMX_PANDN,991) -FD_MNEMONIC(MMX_PAVGB,992) -FD_MNEMONIC(MMX_PAVGW,993) -FD_MNEMONIC(MMX_PCMPEQB,994) -FD_MNEMONIC(MMX_PCMPEQD,995) -FD_MNEMONIC(MMX_PCMPEQW,996) -FD_MNEMONIC(MMX_PCMPGTB,997) -FD_MNEMONIC(MMX_PCMPGTD,998) -FD_MNEMONIC(MMX_PCMPGTW,999) -FD_MNEMONIC(MMX_PEXTRW,1000) -FD_MNEMONIC(MMX_PHADDD,1001) -FD_MNEMONIC(MMX_PHADDSW,1002) -FD_MNEMONIC(MMX_PHADDW,1003) -FD_MNEMONIC(MMX_PHSUBD,1004) -FD_MNEMONIC(MMX_PHSUBSW,1005) -FD_MNEMONIC(MMX_PHSUBW,1006) -FD_MNEMONIC(MMX_PINSRW,1007) -FD_MNEMONIC(MMX_PMADDUBSW,1008) -FD_MNEMONIC(MMX_PMADDWD,1009) -FD_MNEMONIC(MMX_PMAXSW,1010) -FD_MNEMONIC(MMX_PMAXUB,1011) -FD_MNEMONIC(MMX_PMINSW,1012) -FD_MNEMONIC(MMX_PMINUB,1013) -FD_MNEMONIC(MMX_PMOVMSKB,1014) -FD_MNEMONIC(MMX_PMULHRSW,1015) -FD_MNEMONIC(MMX_PMULHUW,1016) -FD_MNEMONIC(MMX_PMULHW,1017) -FD_MNEMONIC(MMX_PMULLW,1018) -FD_MNEMONIC(MMX_PMULUDQ,1019) -FD_MNEMONIC(MMX_POR,1020) -FD_MNEMONIC(MMX_PSADBW,1021) -FD_MNEMONIC(MMX_PSHUFB,1022) -FD_MNEMONIC(MMX_PSHUFW,1023) -FD_MNEMONIC(MMX_PSIGNB,1024) -FD_MNEMONIC(MMX_PSIGND,1025) -FD_MNEMONIC(MMX_PSIGNW,1026) -FD_MNEMONIC(MMX_PSLLD,1027) -FD_MNEMONIC(MMX_PSLLQ,1028) -FD_MNEMONIC(MMX_PSLLW,1029) -FD_MNEMONIC(MMX_PSRAD,1030) -FD_MNEMONIC(MMX_PSRAW,1031) -FD_MNEMONIC(MMX_PSRLD,1032) -FD_MNEMONIC(MMX_PSRLQ,1033) -FD_MNEMONIC(MMX_PSRLW,1034) -FD_MNEMONIC(MMX_PSUBB,1035) -FD_MNEMONIC(MMX_PSUBD,1036) -FD_MNEMONIC(MMX_PSUBQ,1037) -FD_MNEMONIC(MMX_PSUBSB,1038) -FD_MNEMONIC(MMX_PSUBSW,1039) -FD_MNEMONIC(MMX_PSUBUSB,1040) -FD_MNEMONIC(MMX_PSUBUSW,1041) -FD_MNEMONIC(MMX_PSUBW,1042) -FD_MNEMONIC(MMX_PUNPCKHBW,1043) -FD_MNEMONIC(MMX_PUNPCKHDQ,1044) -FD_MNEMONIC(MMX_PUNPCKHWD,1045) -FD_MNEMONIC(MMX_PUNPCKLBW,1046) -FD_MNEMONIC(MMX_PUNPCKLDQ,1047) -FD_MNEMONIC(MMX_PUNPCKLWD,1048) -FD_MNEMONIC(MMX_PXOR,1049) -FD_MNEMONIC(MONITOR,1050) -FD_MNEMONIC(MONITORX,1051) -FD_MNEMONIC(MOV,1052) -FD_MNEMONIC(MOVABS,1053) -FD_MNEMONIC(MOVBE,1054) -FD_MNEMONIC(MOVDIR64B,1055) -FD_MNEMONIC(MOVDIRI,1056) -FD_MNEMONIC(MOVNTI,1057) -FD_MNEMONIC(MOVS,1058) -FD_MNEMONIC(MOVSX,1059) -FD_MNEMONIC(MOVZX,1060) -FD_MNEMONIC(MOV_CR,1061) -FD_MNEMONIC(MOV_DR,1062) -FD_MNEMONIC(MOV_G2S,1063) -FD_MNEMONIC(MOV_S2G,1064) -FD_MNEMONIC(MUL,1065) -FD_MNEMONIC(MULX,1066) -FD_MNEMONIC(MWAIT,1067) -FD_MNEMONIC(MWAITX,1068) -FD_MNEMONIC(NEG,1069) -FD_MNEMONIC(NOP,1070) -FD_MNEMONIC(NOT,1071) -FD_MNEMONIC(OR,1072) -FD_MNEMONIC(OUT,1073) -FD_MNEMONIC(OUTS,1074) -FD_MNEMONIC(PAUSE,1075) -FD_MNEMONIC(PBNDKB,1076) -FD_MNEMONIC(PCONFIG,1077) -FD_MNEMONIC(PDEP,1078) -FD_MNEMONIC(PEXT,1079) -FD_MNEMONIC(POP,1080) -FD_MNEMONIC(POPA,1081) -FD_MNEMONIC(POPCNT,1082) -FD_MNEMONIC(POPF,1083) -FD_MNEMONIC(PREFETCH,1084) -FD_MNEMONIC(PREFETCHIT0,1085) -FD_MNEMONIC(PREFETCHIT1,1086) -FD_MNEMONIC(PREFETCHNTA,1087) -FD_MNEMONIC(PREFETCHT0,1088) -FD_MNEMONIC(PREFETCHT1,1089) -FD_MNEMONIC(PREFETCHT2,1090) -FD_MNEMONIC(PREFETCHW,1091) -FD_MNEMONIC(PREFETCHWT1,1092) -FD_MNEMONIC(PSMASH,1093) -FD_MNEMONIC(PTWRITE,1094) -FD_MNEMONIC(PUSH,1095) -FD_MNEMONIC(PUSHA,1096) -FD_MNEMONIC(PUSHF,1097) -FD_MNEMONIC(PVALIDATE,1098) -FD_MNEMONIC(RCL,1099) -FD_MNEMONIC(RCR,1100) -FD_MNEMONIC(RDFSBASE,1101) -FD_MNEMONIC(RDGSBASE,1102) -FD_MNEMONIC(RDMSR,1103) -FD_MNEMONIC(RDMSRLIST,1104) -FD_MNEMONIC(RDPID,1105) -FD_MNEMONIC(RDPKRU,1106) -FD_MNEMONIC(RDPMC,1107) -FD_MNEMONIC(RDPRU,1108) -FD_MNEMONIC(RDRAND,1109) -FD_MNEMONIC(RDSEED,1110) -FD_MNEMONIC(RDSSP,1111) -FD_MNEMONIC(RDTSC,1112) -FD_MNEMONIC(RDTSCP,1113) -FD_MNEMONIC(REP_MONTMUL,1114) -FD_MNEMONIC(REP_XCRYPTCBC,1115) -FD_MNEMONIC(REP_XCRYPTCFB,1116) -FD_MNEMONIC(REP_XCRYPTCTR,1117) -FD_MNEMONIC(REP_XCRYPTECB,1118) -FD_MNEMONIC(REP_XCRYPTOFB,1119) -FD_MNEMONIC(REP_XSHA1,1120) -FD_MNEMONIC(REP_XSHA256,1121) -FD_MNEMONIC(REP_XSTORE,1122) -FD_MNEMONIC(RESERVED_NOP,1123) -FD_MNEMONIC(RESERVED_PREFETCH,1124) -FD_MNEMONIC(RET,1125) -FD_MNEMONIC(RETF,1126) -FD_MNEMONIC(RMPADJUST,1127) -FD_MNEMONIC(RMPQUERY,1128) -FD_MNEMONIC(RMPREAD,1129) -FD_MNEMONIC(RMPUPDATE,1130) -FD_MNEMONIC(ROL,1131) -FD_MNEMONIC(ROR,1132) -FD_MNEMONIC(RORX,1133) -FD_MNEMONIC(RSM,1134) -FD_MNEMONIC(RSTORSSP,1135) -FD_MNEMONIC(SAHF,1136) -FD_MNEMONIC(SAR,1137) -FD_MNEMONIC(SARX,1138) -FD_MNEMONIC(SAVEPREVSSP,1139) -FD_MNEMONIC(SBB,1140) -FD_MNEMONIC(SCAS,1141) -FD_MNEMONIC(SEAMCALL,1142) -FD_MNEMONIC(SEAMOPS,1143) -FD_MNEMONIC(SEAMRET,1144) -FD_MNEMONIC(SENDUIPI,1145) -FD_MNEMONIC(SERIALIZE,1146) -FD_MNEMONIC(SETA,1147) -FD_MNEMONIC(SETBE,1148) -FD_MNEMONIC(SETC,1149) -FD_MNEMONIC(SETG,1150) -FD_MNEMONIC(SETGE,1151) -FD_MNEMONIC(SETL,1152) -FD_MNEMONIC(SETLE,1153) -FD_MNEMONIC(SETNC,1154) -FD_MNEMONIC(SETNO,1155) -FD_MNEMONIC(SETNP,1156) -FD_MNEMONIC(SETNS,1157) -FD_MNEMONIC(SETNZ,1158) -FD_MNEMONIC(SETO,1159) -FD_MNEMONIC(SETP,1160) -FD_MNEMONIC(SETS,1161) -FD_MNEMONIC(SETSSBSY,1162) -FD_MNEMONIC(SETZ,1163) -FD_MNEMONIC(SFENCE,1164) -FD_MNEMONIC(SGDT,1165) -FD_MNEMONIC(SHA1MSG1,1166) -FD_MNEMONIC(SHA1MSG2,1167) -FD_MNEMONIC(SHA1NEXTE,1168) -FD_MNEMONIC(SHA1RNDS4,1169) -FD_MNEMONIC(SHA256MSG1,1170) -FD_MNEMONIC(SHA256MSG2,1171) -FD_MNEMONIC(SHA256RNDS2,1172) -FD_MNEMONIC(SHL,1173) -FD_MNEMONIC(SHLD,1174) -FD_MNEMONIC(SHLX,1175) -FD_MNEMONIC(SHR,1176) -FD_MNEMONIC(SHRD,1177) -FD_MNEMONIC(SHRX,1178) -FD_MNEMONIC(SIDT,1179) -FD_MNEMONIC(SKINIT,1180) -FD_MNEMONIC(SLDT,1181) -FD_MNEMONIC(SMSW,1182) -FD_MNEMONIC(SSE_ADDPD,1183) -FD_MNEMONIC(SSE_ADDPS,1184) -FD_MNEMONIC(SSE_ADDSD,1185) -FD_MNEMONIC(SSE_ADDSS,1186) -FD_MNEMONIC(SSE_ADDSUBPD,1187) -FD_MNEMONIC(SSE_ADDSUBPS,1188) -FD_MNEMONIC(SSE_ANDNPD,1189) -FD_MNEMONIC(SSE_ANDNPS,1190) -FD_MNEMONIC(SSE_ANDPD,1191) -FD_MNEMONIC(SSE_ANDPS,1192) -FD_MNEMONIC(SSE_BLENDPD,1193) -FD_MNEMONIC(SSE_BLENDPS,1194) -FD_MNEMONIC(SSE_BLENDVPD,1195) -FD_MNEMONIC(SSE_BLENDVPS,1196) -FD_MNEMONIC(SSE_CMPPD,1197) -FD_MNEMONIC(SSE_CMPPS,1198) -FD_MNEMONIC(SSE_CMPSD,1199) -FD_MNEMONIC(SSE_CMPSS,1200) -FD_MNEMONIC(SSE_COMISD,1201) -FD_MNEMONIC(SSE_COMISS,1202) -FD_MNEMONIC(SSE_CVTDQ2PD,1203) -FD_MNEMONIC(SSE_CVTDQ2PS,1204) -FD_MNEMONIC(SSE_CVTPD2DQ,1205) -FD_MNEMONIC(SSE_CVTPD2PS,1206) -FD_MNEMONIC(SSE_CVTPS2DQ,1207) -FD_MNEMONIC(SSE_CVTPS2PD,1208) -FD_MNEMONIC(SSE_CVTSD2SI,1209) -FD_MNEMONIC(SSE_CVTSD2SS,1210) -FD_MNEMONIC(SSE_CVTSI2SD,1211) -FD_MNEMONIC(SSE_CVTSI2SS,1212) -FD_MNEMONIC(SSE_CVTSS2SD,1213) -FD_MNEMONIC(SSE_CVTSS2SI,1214) -FD_MNEMONIC(SSE_CVTTPD2DQ,1215) -FD_MNEMONIC(SSE_CVTTPS2DQ,1216) -FD_MNEMONIC(SSE_CVTTSD2SI,1217) -FD_MNEMONIC(SSE_CVTTSS2SI,1218) -FD_MNEMONIC(SSE_DIVPD,1219) -FD_MNEMONIC(SSE_DIVPS,1220) -FD_MNEMONIC(SSE_DIVSD,1221) -FD_MNEMONIC(SSE_DIVSS,1222) -FD_MNEMONIC(SSE_DPPD,1223) -FD_MNEMONIC(SSE_DPPS,1224) -FD_MNEMONIC(SSE_EXTRACTPS,1225) -FD_MNEMONIC(SSE_EXTRQ,1226) -FD_MNEMONIC(SSE_HADDPD,1227) -FD_MNEMONIC(SSE_HADDPS,1228) -FD_MNEMONIC(SSE_HSUBPD,1229) -FD_MNEMONIC(SSE_HSUBPS,1230) -FD_MNEMONIC(SSE_INSERTPS,1231) -FD_MNEMONIC(SSE_INSERTQ,1232) -FD_MNEMONIC(SSE_LDDQU,1233) -FD_MNEMONIC(SSE_MASKMOVDQU,1234) -FD_MNEMONIC(SSE_MAXPD,1235) -FD_MNEMONIC(SSE_MAXPS,1236) -FD_MNEMONIC(SSE_MAXSD,1237) -FD_MNEMONIC(SSE_MAXSS,1238) -FD_MNEMONIC(SSE_MINPD,1239) -FD_MNEMONIC(SSE_MINPS,1240) -FD_MNEMONIC(SSE_MINSD,1241) -FD_MNEMONIC(SSE_MINSS,1242) -FD_MNEMONIC(SSE_MOVAPD,1243) -FD_MNEMONIC(SSE_MOVAPS,1244) -FD_MNEMONIC(SSE_MOVD,1245) -FD_MNEMONIC(SSE_MOVDDUP,1246) -FD_MNEMONIC(SSE_MOVDQA,1247) -FD_MNEMONIC(SSE_MOVDQU,1248) -FD_MNEMONIC(SSE_MOVHLPS,1249) -FD_MNEMONIC(SSE_MOVHPD,1250) -FD_MNEMONIC(SSE_MOVHPS,1251) -FD_MNEMONIC(SSE_MOVLHPS,1252) -FD_MNEMONIC(SSE_MOVLPD,1253) -FD_MNEMONIC(SSE_MOVLPS,1254) -FD_MNEMONIC(SSE_MOVMSKPD,1255) -FD_MNEMONIC(SSE_MOVMSKPS,1256) -FD_MNEMONIC(SSE_MOVNTDQ,1257) -FD_MNEMONIC(SSE_MOVNTDQA,1258) -FD_MNEMONIC(SSE_MOVNTPD,1259) -FD_MNEMONIC(SSE_MOVNTPS,1260) -FD_MNEMONIC(SSE_MOVNTSD,1261) -FD_MNEMONIC(SSE_MOVNTSS,1262) -FD_MNEMONIC(SSE_MOVQ,1263) -FD_MNEMONIC(SSE_MOVSD,1264) -FD_MNEMONIC(SSE_MOVSHDUP,1265) -FD_MNEMONIC(SSE_MOVSLDUP,1266) -FD_MNEMONIC(SSE_MOVSS,1267) -FD_MNEMONIC(SSE_MOVUPD,1268) -FD_MNEMONIC(SSE_MOVUPS,1269) -FD_MNEMONIC(SSE_MPSADBW,1270) -FD_MNEMONIC(SSE_MULPD,1271) -FD_MNEMONIC(SSE_MULPS,1272) -FD_MNEMONIC(SSE_MULSD,1273) -FD_MNEMONIC(SSE_MULSS,1274) -FD_MNEMONIC(SSE_ORPD,1275) -FD_MNEMONIC(SSE_ORPS,1276) -FD_MNEMONIC(SSE_PABSB,1277) -FD_MNEMONIC(SSE_PABSD,1278) -FD_MNEMONIC(SSE_PABSW,1279) -FD_MNEMONIC(SSE_PACKSSDW,1280) -FD_MNEMONIC(SSE_PACKSSWB,1281) -FD_MNEMONIC(SSE_PACKUSDW,1282) -FD_MNEMONIC(SSE_PACKUSWB,1283) -FD_MNEMONIC(SSE_PADDB,1284) -FD_MNEMONIC(SSE_PADDD,1285) -FD_MNEMONIC(SSE_PADDQ,1286) -FD_MNEMONIC(SSE_PADDSB,1287) -FD_MNEMONIC(SSE_PADDSW,1288) -FD_MNEMONIC(SSE_PADDUSB,1289) -FD_MNEMONIC(SSE_PADDUSW,1290) -FD_MNEMONIC(SSE_PADDW,1291) -FD_MNEMONIC(SSE_PALIGNR,1292) -FD_MNEMONIC(SSE_PAND,1293) -FD_MNEMONIC(SSE_PANDN,1294) -FD_MNEMONIC(SSE_PAVGB,1295) -FD_MNEMONIC(SSE_PAVGW,1296) -FD_MNEMONIC(SSE_PBLENDVB,1297) -FD_MNEMONIC(SSE_PBLENDW,1298) -FD_MNEMONIC(SSE_PCLMULQDQ,1299) -FD_MNEMONIC(SSE_PCMPEQB,1300) -FD_MNEMONIC(SSE_PCMPEQD,1301) -FD_MNEMONIC(SSE_PCMPEQQ,1302) -FD_MNEMONIC(SSE_PCMPEQW,1303) -FD_MNEMONIC(SSE_PCMPESTRI,1304) -FD_MNEMONIC(SSE_PCMPESTRM,1305) -FD_MNEMONIC(SSE_PCMPGTB,1306) -FD_MNEMONIC(SSE_PCMPGTD,1307) -FD_MNEMONIC(SSE_PCMPGTQ,1308) -FD_MNEMONIC(SSE_PCMPGTW,1309) -FD_MNEMONIC(SSE_PCMPISTRI,1310) -FD_MNEMONIC(SSE_PCMPISTRM,1311) -FD_MNEMONIC(SSE_PEXTRB,1312) -FD_MNEMONIC(SSE_PEXTRD,1313) -FD_MNEMONIC(SSE_PEXTRQ,1314) -FD_MNEMONIC(SSE_PEXTRW,1315) -FD_MNEMONIC(SSE_PHADDD,1316) -FD_MNEMONIC(SSE_PHADDSW,1317) -FD_MNEMONIC(SSE_PHADDW,1318) -FD_MNEMONIC(SSE_PHMINPOSUW,1319) -FD_MNEMONIC(SSE_PHSUBD,1320) -FD_MNEMONIC(SSE_PHSUBSW,1321) -FD_MNEMONIC(SSE_PHSUBW,1322) -FD_MNEMONIC(SSE_PINSRB,1323) -FD_MNEMONIC(SSE_PINSRD,1324) -FD_MNEMONIC(SSE_PINSRQ,1325) -FD_MNEMONIC(SSE_PINSRW,1326) -FD_MNEMONIC(SSE_PMADDUBSW,1327) -FD_MNEMONIC(SSE_PMADDWD,1328) -FD_MNEMONIC(SSE_PMAXSB,1329) -FD_MNEMONIC(SSE_PMAXSD,1330) -FD_MNEMONIC(SSE_PMAXSW,1331) -FD_MNEMONIC(SSE_PMAXUB,1332) -FD_MNEMONIC(SSE_PMAXUD,1333) -FD_MNEMONIC(SSE_PMAXUW,1334) -FD_MNEMONIC(SSE_PMINSB,1335) -FD_MNEMONIC(SSE_PMINSD,1336) -FD_MNEMONIC(SSE_PMINSW,1337) -FD_MNEMONIC(SSE_PMINUB,1338) -FD_MNEMONIC(SSE_PMINUD,1339) -FD_MNEMONIC(SSE_PMINUW,1340) -FD_MNEMONIC(SSE_PMOVMSKB,1341) -FD_MNEMONIC(SSE_PMOVSXBD,1342) -FD_MNEMONIC(SSE_PMOVSXBQ,1343) -FD_MNEMONIC(SSE_PMOVSXBW,1344) -FD_MNEMONIC(SSE_PMOVSXDQ,1345) -FD_MNEMONIC(SSE_PMOVSXWD,1346) -FD_MNEMONIC(SSE_PMOVSXWQ,1347) -FD_MNEMONIC(SSE_PMOVZXBD,1348) -FD_MNEMONIC(SSE_PMOVZXBQ,1349) -FD_MNEMONIC(SSE_PMOVZXBW,1350) -FD_MNEMONIC(SSE_PMOVZXDQ,1351) -FD_MNEMONIC(SSE_PMOVZXWD,1352) -FD_MNEMONIC(SSE_PMOVZXWQ,1353) -FD_MNEMONIC(SSE_PMULDQ,1354) -FD_MNEMONIC(SSE_PMULHRSW,1355) -FD_MNEMONIC(SSE_PMULHUW,1356) -FD_MNEMONIC(SSE_PMULHW,1357) -FD_MNEMONIC(SSE_PMULLD,1358) -FD_MNEMONIC(SSE_PMULLW,1359) -FD_MNEMONIC(SSE_PMULUDQ,1360) -FD_MNEMONIC(SSE_POR,1361) -FD_MNEMONIC(SSE_PSADBW,1362) -FD_MNEMONIC(SSE_PSHUFB,1363) -FD_MNEMONIC(SSE_PSHUFD,1364) -FD_MNEMONIC(SSE_PSHUFHW,1365) -FD_MNEMONIC(SSE_PSHUFLW,1366) -FD_MNEMONIC(SSE_PSIGNB,1367) -FD_MNEMONIC(SSE_PSIGND,1368) -FD_MNEMONIC(SSE_PSIGNW,1369) -FD_MNEMONIC(SSE_PSLLD,1370) -FD_MNEMONIC(SSE_PSLLDQ,1371) -FD_MNEMONIC(SSE_PSLLQ,1372) -FD_MNEMONIC(SSE_PSLLW,1373) -FD_MNEMONIC(SSE_PSRAD,1374) -FD_MNEMONIC(SSE_PSRAW,1375) -FD_MNEMONIC(SSE_PSRLD,1376) -FD_MNEMONIC(SSE_PSRLDQ,1377) -FD_MNEMONIC(SSE_PSRLQ,1378) -FD_MNEMONIC(SSE_PSRLW,1379) -FD_MNEMONIC(SSE_PSUBB,1380) -FD_MNEMONIC(SSE_PSUBD,1381) -FD_MNEMONIC(SSE_PSUBQ,1382) -FD_MNEMONIC(SSE_PSUBSB,1383) -FD_MNEMONIC(SSE_PSUBSW,1384) -FD_MNEMONIC(SSE_PSUBUSB,1385) -FD_MNEMONIC(SSE_PSUBUSW,1386) -FD_MNEMONIC(SSE_PSUBW,1387) -FD_MNEMONIC(SSE_PTEST,1388) -FD_MNEMONIC(SSE_PUNPCKHBW,1389) -FD_MNEMONIC(SSE_PUNPCKHDQ,1390) -FD_MNEMONIC(SSE_PUNPCKHQDQ,1391) -FD_MNEMONIC(SSE_PUNPCKHWD,1392) -FD_MNEMONIC(SSE_PUNPCKLBW,1393) -FD_MNEMONIC(SSE_PUNPCKLDQ,1394) -FD_MNEMONIC(SSE_PUNPCKLQDQ,1395) -FD_MNEMONIC(SSE_PUNPCKLWD,1396) -FD_MNEMONIC(SSE_PXOR,1397) -FD_MNEMONIC(SSE_RCPPS,1398) -FD_MNEMONIC(SSE_RCPSS,1399) -FD_MNEMONIC(SSE_ROUNDPD,1400) -FD_MNEMONIC(SSE_ROUNDPS,1401) -FD_MNEMONIC(SSE_ROUNDSD,1402) -FD_MNEMONIC(SSE_ROUNDSS,1403) -FD_MNEMONIC(SSE_RSQRTPS,1404) -FD_MNEMONIC(SSE_RSQRTSS,1405) -FD_MNEMONIC(SSE_SHUFPD,1406) -FD_MNEMONIC(SSE_SHUFPS,1407) -FD_MNEMONIC(SSE_SQRTPD,1408) -FD_MNEMONIC(SSE_SQRTPS,1409) -FD_MNEMONIC(SSE_SQRTSD,1410) -FD_MNEMONIC(SSE_SQRTSS,1411) -FD_MNEMONIC(SSE_SUBPD,1412) -FD_MNEMONIC(SSE_SUBPS,1413) -FD_MNEMONIC(SSE_SUBSD,1414) -FD_MNEMONIC(SSE_SUBSS,1415) -FD_MNEMONIC(SSE_UCOMISD,1416) -FD_MNEMONIC(SSE_UCOMISS,1417) -FD_MNEMONIC(SSE_UNPCKHPD,1418) -FD_MNEMONIC(SSE_UNPCKHPS,1419) -FD_MNEMONIC(SSE_UNPCKLPD,1420) -FD_MNEMONIC(SSE_UNPCKLPS,1421) -FD_MNEMONIC(SSE_XORPD,1422) -FD_MNEMONIC(SSE_XORPS,1423) -FD_MNEMONIC(STAC,1424) -FD_MNEMONIC(STC,1425) -FD_MNEMONIC(STD,1426) -FD_MNEMONIC(STGI,1427) -FD_MNEMONIC(STI,1428) -FD_MNEMONIC(STMXCSR,1429) -FD_MNEMONIC(STOS,1430) -FD_MNEMONIC(STR,1431) -FD_MNEMONIC(STTILECFG,1432) -FD_MNEMONIC(STUI,1433) -FD_MNEMONIC(SUB,1434) -FD_MNEMONIC(SWAPGS,1435) -FD_MNEMONIC(SYSCALL,1436) -FD_MNEMONIC(SYSENTER,1437) -FD_MNEMONIC(SYSEXIT,1438) -FD_MNEMONIC(SYSRET,1439) -FD_MNEMONIC(TCMMIMFP16PS,1440) -FD_MNEMONIC(TCMMRLFP16PS,1441) -FD_MNEMONIC(TDCALL,1442) -FD_MNEMONIC(TDPBF16PS,1443) -FD_MNEMONIC(TDPBSSD,1444) -FD_MNEMONIC(TDPBSUD,1445) -FD_MNEMONIC(TDPBUSD,1446) -FD_MNEMONIC(TDPBUUD,1447) -FD_MNEMONIC(TDPFP16PS,1448) -FD_MNEMONIC(TEST,1449) -FD_MNEMONIC(TESTUI,1450) -FD_MNEMONIC(TILELOADD,1451) -FD_MNEMONIC(TILELOADDT1,1452) -FD_MNEMONIC(TILERELEASE,1453) -FD_MNEMONIC(TILESTORED,1454) -FD_MNEMONIC(TILEZERO,1455) -FD_MNEMONIC(TLBSYNC,1456) -FD_MNEMONIC(TPAUSE,1457) -FD_MNEMONIC(TZCNT,1458) -FD_MNEMONIC(UD0,1459) -FD_MNEMONIC(UD1,1460) -FD_MNEMONIC(UD2,1461) -FD_MNEMONIC(UIRET,1462) -FD_MNEMONIC(UMONITOR,1463) -FD_MNEMONIC(UMWAIT,1464) -FD_MNEMONIC(URDMSR,1465) -FD_MNEMONIC(UWRMSR,1466) -FD_MNEMONIC(VADDPD,1467) -FD_MNEMONIC(VADDPS,1468) -FD_MNEMONIC(VADDSD,1469) -FD_MNEMONIC(VADDSS,1470) -FD_MNEMONIC(VADDSUBPD,1471) -FD_MNEMONIC(VADDSUBPS,1472) -FD_MNEMONIC(VAESDEC,1473) -FD_MNEMONIC(VAESDECLAST,1474) -FD_MNEMONIC(VAESENC,1475) -FD_MNEMONIC(VAESENCLAST,1476) -FD_MNEMONIC(VAESIMC,1477) -FD_MNEMONIC(VAESKEYGENASSIST,1478) -FD_MNEMONIC(VANDNPD,1479) -FD_MNEMONIC(VANDNPS,1480) -FD_MNEMONIC(VANDPD,1481) -FD_MNEMONIC(VANDPS,1482) -FD_MNEMONIC(VBCSTNEBF162PS,1483) -FD_MNEMONIC(VBCSTNESH2PS,1484) -FD_MNEMONIC(VBLENDPD,1485) -FD_MNEMONIC(VBLENDPS,1486) -FD_MNEMONIC(VBLENDVPD,1487) -FD_MNEMONIC(VBLENDVPS,1488) -FD_MNEMONIC(VBROADCASTF128,1489) -FD_MNEMONIC(VBROADCASTI128,1490) -FD_MNEMONIC(VBROADCASTSD,1491) -FD_MNEMONIC(VBROADCASTSS,1492) -FD_MNEMONIC(VCMPPD,1493) -FD_MNEMONIC(VCMPPS,1494) -FD_MNEMONIC(VCMPSD,1495) -FD_MNEMONIC(VCMPSS,1496) -FD_MNEMONIC(VCOMISD,1497) -FD_MNEMONIC(VCOMISS,1498) -FD_MNEMONIC(VCVTDQ2PD,1499) -FD_MNEMONIC(VCVTDQ2PS,1500) -FD_MNEMONIC(VCVTNEEBF162PS,1501) -FD_MNEMONIC(VCVTNEEPH2PS,1502) -FD_MNEMONIC(VCVTNEOBF162PS,1503) -FD_MNEMONIC(VCVTNEOPH2PS,1504) -FD_MNEMONIC(VCVTNEPS2BF16,1505) -FD_MNEMONIC(VCVTPD2DQ,1506) -FD_MNEMONIC(VCVTPD2PS,1507) -FD_MNEMONIC(VCVTPH2PS,1508) -FD_MNEMONIC(VCVTPS2DQ,1509) -FD_MNEMONIC(VCVTPS2PD,1510) -FD_MNEMONIC(VCVTPS2PH,1511) -FD_MNEMONIC(VCVTSD2SI,1512) -FD_MNEMONIC(VCVTSD2SS,1513) -FD_MNEMONIC(VCVTSI2SD,1514) -FD_MNEMONIC(VCVTSI2SS,1515) -FD_MNEMONIC(VCVTSS2SD,1516) -FD_MNEMONIC(VCVTSS2SI,1517) -FD_MNEMONIC(VCVTTPD2DQ,1518) -FD_MNEMONIC(VCVTTPS2DQ,1519) -FD_MNEMONIC(VCVTTSD2SI,1520) -FD_MNEMONIC(VCVTTSS2SI,1521) -FD_MNEMONIC(VDIVPD,1522) -FD_MNEMONIC(VDIVPS,1523) -FD_MNEMONIC(VDIVSD,1524) -FD_MNEMONIC(VDIVSS,1525) -FD_MNEMONIC(VDPPD,1526) -FD_MNEMONIC(VDPPS,1527) -FD_MNEMONIC(VERR,1528) -FD_MNEMONIC(VERW,1529) -FD_MNEMONIC(VEXTRACTF128,1530) -FD_MNEMONIC(VEXTRACTI128,1531) -FD_MNEMONIC(VEXTRACTPS,1532) -FD_MNEMONIC(VFMADD132PD,1533) -FD_MNEMONIC(VFMADD132PS,1534) -FD_MNEMONIC(VFMADD132SD,1535) -FD_MNEMONIC(VFMADD132SS,1536) -FD_MNEMONIC(VFMADD213PD,1537) -FD_MNEMONIC(VFMADD213PS,1538) -FD_MNEMONIC(VFMADD213SD,1539) -FD_MNEMONIC(VFMADD213SS,1540) -FD_MNEMONIC(VFMADD231PD,1541) -FD_MNEMONIC(VFMADD231PS,1542) -FD_MNEMONIC(VFMADD231SD,1543) -FD_MNEMONIC(VFMADD231SS,1544) -FD_MNEMONIC(VFMADDSUB132PD,1545) -FD_MNEMONIC(VFMADDSUB132PS,1546) -FD_MNEMONIC(VFMADDSUB213PD,1547) -FD_MNEMONIC(VFMADDSUB213PS,1548) -FD_MNEMONIC(VFMADDSUB231PD,1549) -FD_MNEMONIC(VFMADDSUB231PS,1550) -FD_MNEMONIC(VFMSUB132PD,1551) -FD_MNEMONIC(VFMSUB132PS,1552) -FD_MNEMONIC(VFMSUB132SD,1553) -FD_MNEMONIC(VFMSUB132SS,1554) -FD_MNEMONIC(VFMSUB213PD,1555) -FD_MNEMONIC(VFMSUB213PS,1556) -FD_MNEMONIC(VFMSUB213SD,1557) -FD_MNEMONIC(VFMSUB213SS,1558) -FD_MNEMONIC(VFMSUB231PD,1559) -FD_MNEMONIC(VFMSUB231PS,1560) -FD_MNEMONIC(VFMSUB231SD,1561) -FD_MNEMONIC(VFMSUB231SS,1562) -FD_MNEMONIC(VFMSUBADD132PD,1563) -FD_MNEMONIC(VFMSUBADD132PS,1564) -FD_MNEMONIC(VFMSUBADD213PD,1565) -FD_MNEMONIC(VFMSUBADD213PS,1566) -FD_MNEMONIC(VFMSUBADD231PD,1567) -FD_MNEMONIC(VFMSUBADD231PS,1568) -FD_MNEMONIC(VFNMADD132PD,1569) -FD_MNEMONIC(VFNMADD132PS,1570) -FD_MNEMONIC(VFNMADD132SD,1571) -FD_MNEMONIC(VFNMADD132SS,1572) -FD_MNEMONIC(VFNMADD213PD,1573) -FD_MNEMONIC(VFNMADD213PS,1574) -FD_MNEMONIC(VFNMADD213SD,1575) -FD_MNEMONIC(VFNMADD213SS,1576) -FD_MNEMONIC(VFNMADD231PD,1577) -FD_MNEMONIC(VFNMADD231PS,1578) -FD_MNEMONIC(VFNMADD231SD,1579) -FD_MNEMONIC(VFNMADD231SS,1580) -FD_MNEMONIC(VFNMSUB132PD,1581) -FD_MNEMONIC(VFNMSUB132PS,1582) -FD_MNEMONIC(VFNMSUB132SD,1583) -FD_MNEMONIC(VFNMSUB132SS,1584) -FD_MNEMONIC(VFNMSUB213PD,1585) -FD_MNEMONIC(VFNMSUB213PS,1586) -FD_MNEMONIC(VFNMSUB213SD,1587) -FD_MNEMONIC(VFNMSUB213SS,1588) -FD_MNEMONIC(VFNMSUB231PD,1589) -FD_MNEMONIC(VFNMSUB231PS,1590) -FD_MNEMONIC(VFNMSUB231SD,1591) -FD_MNEMONIC(VFNMSUB231SS,1592) -FD_MNEMONIC(VGATHERDPD,1593) -FD_MNEMONIC(VGATHERDPS,1594) -FD_MNEMONIC(VGATHERQPD,1595) -FD_MNEMONIC(VGATHERQPS,1596) -FD_MNEMONIC(VGF2P8AFFINEINVQB,1597) -FD_MNEMONIC(VGF2P8AFFINEQB,1598) -FD_MNEMONIC(VGF2P8MULB,1599) -FD_MNEMONIC(VHADDPD,1600) -FD_MNEMONIC(VHADDPS,1601) -FD_MNEMONIC(VHSUBPD,1602) -FD_MNEMONIC(VHSUBPS,1603) -FD_MNEMONIC(VINSERTF128,1604) -FD_MNEMONIC(VINSERTI128,1605) -FD_MNEMONIC(VINSERTPS,1606) -FD_MNEMONIC(VLDDQU,1607) -FD_MNEMONIC(VLDMXCSR,1608) -FD_MNEMONIC(VMASKMOVDQU,1609) -FD_MNEMONIC(VMASKMOVPD,1610) -FD_MNEMONIC(VMASKMOVPS,1611) -FD_MNEMONIC(VMAXPD,1612) -FD_MNEMONIC(VMAXPS,1613) -FD_MNEMONIC(VMAXSD,1614) -FD_MNEMONIC(VMAXSS,1615) -FD_MNEMONIC(VMCALL,1616) -FD_MNEMONIC(VMCLEAR,1617) -FD_MNEMONIC(VMFUNC,1618) -FD_MNEMONIC(VMGEXIT,1619) -FD_MNEMONIC(VMINPD,1620) -FD_MNEMONIC(VMINPS,1621) -FD_MNEMONIC(VMINSD,1622) -FD_MNEMONIC(VMINSS,1623) -FD_MNEMONIC(VMLAUNCH,1624) -FD_MNEMONIC(VMLOAD,1625) -FD_MNEMONIC(VMMCALL,1626) -FD_MNEMONIC(VMOVAPD,1627) -FD_MNEMONIC(VMOVAPS,1628) -FD_MNEMONIC(VMOVD,1629) -FD_MNEMONIC(VMOVDDUP,1630) -FD_MNEMONIC(VMOVDQA,1631) -FD_MNEMONIC(VMOVDQU,1632) -FD_MNEMONIC(VMOVHLPS,1633) -FD_MNEMONIC(VMOVHPD,1634) -FD_MNEMONIC(VMOVHPS,1635) -FD_MNEMONIC(VMOVLHPS,1636) -FD_MNEMONIC(VMOVLPD,1637) -FD_MNEMONIC(VMOVLPS,1638) -FD_MNEMONIC(VMOVMSKPD,1639) -FD_MNEMONIC(VMOVMSKPS,1640) -FD_MNEMONIC(VMOVNTDQ,1641) -FD_MNEMONIC(VMOVNTDQA,1642) -FD_MNEMONIC(VMOVNTPD,1643) -FD_MNEMONIC(VMOVNTPS,1644) -FD_MNEMONIC(VMOVQ,1645) -FD_MNEMONIC(VMOVSD,1646) -FD_MNEMONIC(VMOVSHDUP,1647) -FD_MNEMONIC(VMOVSLDUP,1648) -FD_MNEMONIC(VMOVSS,1649) -FD_MNEMONIC(VMOVUPD,1650) -FD_MNEMONIC(VMOVUPS,1651) -FD_MNEMONIC(VMPSADBW,1652) -FD_MNEMONIC(VMPTRLD,1653) -FD_MNEMONIC(VMPTRST,1654) -FD_MNEMONIC(VMREAD,1655) -FD_MNEMONIC(VMRESUME,1656) -FD_MNEMONIC(VMRUN,1657) -FD_MNEMONIC(VMSAVE,1658) -FD_MNEMONIC(VMULPD,1659) -FD_MNEMONIC(VMULPS,1660) -FD_MNEMONIC(VMULSD,1661) -FD_MNEMONIC(VMULSS,1662) -FD_MNEMONIC(VMWRITE,1663) -FD_MNEMONIC(VMXOFF,1664) -FD_MNEMONIC(VMXON,1665) -FD_MNEMONIC(VORPD,1666) -FD_MNEMONIC(VORPS,1667) -FD_MNEMONIC(VPABSB,1668) -FD_MNEMONIC(VPABSD,1669) -FD_MNEMONIC(VPABSW,1670) -FD_MNEMONIC(VPACKSSDW,1671) -FD_MNEMONIC(VPACKSSWB,1672) -FD_MNEMONIC(VPACKUSDW,1673) -FD_MNEMONIC(VPACKUSWB,1674) -FD_MNEMONIC(VPADDB,1675) -FD_MNEMONIC(VPADDD,1676) -FD_MNEMONIC(VPADDQ,1677) -FD_MNEMONIC(VPADDSB,1678) -FD_MNEMONIC(VPADDSW,1679) -FD_MNEMONIC(VPADDUSB,1680) -FD_MNEMONIC(VPADDUSW,1681) -FD_MNEMONIC(VPADDW,1682) -FD_MNEMONIC(VPALIGNR,1683) -FD_MNEMONIC(VPAND,1684) -FD_MNEMONIC(VPANDN,1685) -FD_MNEMONIC(VPAVGB,1686) -FD_MNEMONIC(VPAVGW,1687) -FD_MNEMONIC(VPBLENDD,1688) -FD_MNEMONIC(VPBLENDVB,1689) -FD_MNEMONIC(VPBLENDW,1690) -FD_MNEMONIC(VPBROADCASTB,1691) -FD_MNEMONIC(VPBROADCASTD,1692) -FD_MNEMONIC(VPBROADCASTQ,1693) -FD_MNEMONIC(VPBROADCASTW,1694) -FD_MNEMONIC(VPCLMULQDQ,1695) -FD_MNEMONIC(VPCMPEQB,1696) -FD_MNEMONIC(VPCMPEQD,1697) -FD_MNEMONIC(VPCMPEQQ,1698) -FD_MNEMONIC(VPCMPEQW,1699) -FD_MNEMONIC(VPCMPESTRI,1700) -FD_MNEMONIC(VPCMPESTRM,1701) -FD_MNEMONIC(VPCMPGTB,1702) -FD_MNEMONIC(VPCMPGTD,1703) -FD_MNEMONIC(VPCMPGTQ,1704) -FD_MNEMONIC(VPCMPGTW,1705) -FD_MNEMONIC(VPCMPISTRI,1706) -FD_MNEMONIC(VPCMPISTRM,1707) -FD_MNEMONIC(VPDPBSSD,1708) -FD_MNEMONIC(VPDPBSSDS,1709) -FD_MNEMONIC(VPDPBSUD,1710) -FD_MNEMONIC(VPDPBSUDS,1711) -FD_MNEMONIC(VPDPBUSD,1712) -FD_MNEMONIC(VPDPBUSDS,1713) -FD_MNEMONIC(VPDPBUUD,1714) -FD_MNEMONIC(VPDPBUUDS,1715) -FD_MNEMONIC(VPDPWSSD,1716) -FD_MNEMONIC(VPDPWSSDS,1717) -FD_MNEMONIC(VPERM2F128,1718) -FD_MNEMONIC(VPERM2I128,1719) -FD_MNEMONIC(VPERMD,1720) -FD_MNEMONIC(VPERMILPD,1721) -FD_MNEMONIC(VPERMILPS,1722) -FD_MNEMONIC(VPERMPD,1723) -FD_MNEMONIC(VPERMPS,1724) -FD_MNEMONIC(VPERMQ,1725) -FD_MNEMONIC(VPEXTRB,1726) -FD_MNEMONIC(VPEXTRD,1727) -FD_MNEMONIC(VPEXTRQ,1728) -FD_MNEMONIC(VPEXTRW,1729) -FD_MNEMONIC(VPGATHERDD,1730) -FD_MNEMONIC(VPGATHERDQ,1731) -FD_MNEMONIC(VPGATHERQD,1732) -FD_MNEMONIC(VPGATHERQQ,1733) -FD_MNEMONIC(VPHADDD,1734) -FD_MNEMONIC(VPHADDSW,1735) -FD_MNEMONIC(VPHADDW,1736) -FD_MNEMONIC(VPHMINPOSUW,1737) -FD_MNEMONIC(VPHSUBD,1738) -FD_MNEMONIC(VPHSUBSW,1739) -FD_MNEMONIC(VPHSUBW,1740) -FD_MNEMONIC(VPINSRB,1741) -FD_MNEMONIC(VPINSRD,1742) -FD_MNEMONIC(VPINSRQ,1743) -FD_MNEMONIC(VPINSRW,1744) -FD_MNEMONIC(VPMADD52HUQ,1745) -FD_MNEMONIC(VPMADD52LUQ,1746) -FD_MNEMONIC(VPMADDUBSW,1747) -FD_MNEMONIC(VPMADDWD,1748) -FD_MNEMONIC(VPMASKMOVD,1749) -FD_MNEMONIC(VPMASKMOVQ,1750) -FD_MNEMONIC(VPMAXSB,1751) -FD_MNEMONIC(VPMAXSD,1752) -FD_MNEMONIC(VPMAXSW,1753) -FD_MNEMONIC(VPMAXUB,1754) -FD_MNEMONIC(VPMAXUD,1755) -FD_MNEMONIC(VPMAXUW,1756) -FD_MNEMONIC(VPMINSB,1757) -FD_MNEMONIC(VPMINSD,1758) -FD_MNEMONIC(VPMINSW,1759) -FD_MNEMONIC(VPMINUB,1760) -FD_MNEMONIC(VPMINUD,1761) -FD_MNEMONIC(VPMINUW,1762) -FD_MNEMONIC(VPMOVMSKB,1763) -FD_MNEMONIC(VPMOVSXBD,1764) -FD_MNEMONIC(VPMOVSXBQ,1765) -FD_MNEMONIC(VPMOVSXBW,1766) -FD_MNEMONIC(VPMOVSXDQ,1767) -FD_MNEMONIC(VPMOVSXWD,1768) -FD_MNEMONIC(VPMOVSXWQ,1769) -FD_MNEMONIC(VPMOVZXBD,1770) -FD_MNEMONIC(VPMOVZXBQ,1771) -FD_MNEMONIC(VPMOVZXBW,1772) -FD_MNEMONIC(VPMOVZXDQ,1773) -FD_MNEMONIC(VPMOVZXWD,1774) -FD_MNEMONIC(VPMOVZXWQ,1775) -FD_MNEMONIC(VPMULDQ,1776) -FD_MNEMONIC(VPMULHRSW,1777) -FD_MNEMONIC(VPMULHUW,1778) -FD_MNEMONIC(VPMULHW,1779) -FD_MNEMONIC(VPMULLD,1780) -FD_MNEMONIC(VPMULLW,1781) -FD_MNEMONIC(VPMULUDQ,1782) -FD_MNEMONIC(VPOR,1783) -FD_MNEMONIC(VPSADBW,1784) -FD_MNEMONIC(VPSHUFB,1785) -FD_MNEMONIC(VPSHUFD,1786) -FD_MNEMONIC(VPSHUFHW,1787) -FD_MNEMONIC(VPSHUFLW,1788) -FD_MNEMONIC(VPSIGNB,1789) -FD_MNEMONIC(VPSIGND,1790) -FD_MNEMONIC(VPSIGNW,1791) -FD_MNEMONIC(VPSLLD,1792) -FD_MNEMONIC(VPSLLDQ,1793) -FD_MNEMONIC(VPSLLQ,1794) -FD_MNEMONIC(VPSLLVD,1795) -FD_MNEMONIC(VPSLLVQ,1796) -FD_MNEMONIC(VPSLLW,1797) -FD_MNEMONIC(VPSRAD,1798) -FD_MNEMONIC(VPSRAVD,1799) -FD_MNEMONIC(VPSRAW,1800) -FD_MNEMONIC(VPSRLD,1801) -FD_MNEMONIC(VPSRLDQ,1802) -FD_MNEMONIC(VPSRLQ,1803) -FD_MNEMONIC(VPSRLVD,1804) -FD_MNEMONIC(VPSRLVQ,1805) -FD_MNEMONIC(VPSRLW,1806) -FD_MNEMONIC(VPSUBB,1807) -FD_MNEMONIC(VPSUBD,1808) -FD_MNEMONIC(VPSUBQ,1809) -FD_MNEMONIC(VPSUBSB,1810) -FD_MNEMONIC(VPSUBSW,1811) -FD_MNEMONIC(VPSUBUSB,1812) -FD_MNEMONIC(VPSUBUSW,1813) -FD_MNEMONIC(VPSUBW,1814) -FD_MNEMONIC(VPTEST,1815) -FD_MNEMONIC(VPUNPCKHBW,1816) -FD_MNEMONIC(VPUNPCKHDQ,1817) -FD_MNEMONIC(VPUNPCKHQDQ,1818) -FD_MNEMONIC(VPUNPCKHWD,1819) -FD_MNEMONIC(VPUNPCKLBW,1820) -FD_MNEMONIC(VPUNPCKLDQ,1821) -FD_MNEMONIC(VPUNPCKLQDQ,1822) -FD_MNEMONIC(VPUNPCKLWD,1823) -FD_MNEMONIC(VPXOR,1824) -FD_MNEMONIC(VRCPPS,1825) -FD_MNEMONIC(VRCPSS,1826) -FD_MNEMONIC(VROUNDPD,1827) -FD_MNEMONIC(VROUNDPS,1828) -FD_MNEMONIC(VROUNDSD,1829) -FD_MNEMONIC(VROUNDSS,1830) -FD_MNEMONIC(VRSQRTPS,1831) -FD_MNEMONIC(VRSQRTSS,1832) -FD_MNEMONIC(VSHUFPD,1833) -FD_MNEMONIC(VSHUFPS,1834) -FD_MNEMONIC(VSM4KEY4,1835) -FD_MNEMONIC(VSM4RNDS4,1836) -FD_MNEMONIC(VSQRTPD,1837) -FD_MNEMONIC(VSQRTPS,1838) -FD_MNEMONIC(VSQRTSD,1839) -FD_MNEMONIC(VSQRTSS,1840) -FD_MNEMONIC(VSTMXCSR,1841) -FD_MNEMONIC(VSUBPD,1842) -FD_MNEMONIC(VSUBPS,1843) -FD_MNEMONIC(VSUBSD,1844) -FD_MNEMONIC(VSUBSS,1845) -FD_MNEMONIC(VTESTPD,1846) -FD_MNEMONIC(VTESTPS,1847) -FD_MNEMONIC(VUCOMISD,1848) -FD_MNEMONIC(VUCOMISS,1849) -FD_MNEMONIC(VUNPCKHPD,1850) -FD_MNEMONIC(VUNPCKHPS,1851) -FD_MNEMONIC(VUNPCKLPD,1852) -FD_MNEMONIC(VUNPCKLPS,1853) -FD_MNEMONIC(VXORPD,1854) -FD_MNEMONIC(VXORPS,1855) -FD_MNEMONIC(VZEROALL,1856) -FD_MNEMONIC(VZEROUPPER,1857) -FD_MNEMONIC(WBINVD,1858) -FD_MNEMONIC(WBNOINVD,1859) -FD_MNEMONIC(WRFSBASE,1860) -FD_MNEMONIC(WRGSBASE,1861) -FD_MNEMONIC(WRMSR,1862) -FD_MNEMONIC(WRMSRLIST,1863) -FD_MNEMONIC(WRMSRNS,1864) -FD_MNEMONIC(WRPKRU,1865) -FD_MNEMONIC(WRSS,1866) -FD_MNEMONIC(WRUSS,1867) -FD_MNEMONIC(XABORT,1868) -FD_MNEMONIC(XADD,1869) -FD_MNEMONIC(XBEGIN,1870) -FD_MNEMONIC(XCHG,1871) -FD_MNEMONIC(XCHG_NOP,1872) -FD_MNEMONIC(XEND,1873) -FD_MNEMONIC(XGETBV,1874) -FD_MNEMONIC(XLATB,1875) -FD_MNEMONIC(XOR,1876) -FD_MNEMONIC(XRESLDTRK,1877) -FD_MNEMONIC(XRSTOR,1878) -FD_MNEMONIC(XRSTORS,1879) -FD_MNEMONIC(XSAVE,1880) -FD_MNEMONIC(XSAVEC,1881) -FD_MNEMONIC(XSAVEOPT,1882) -FD_MNEMONIC(XSAVES,1883) -FD_MNEMONIC(XSETBV,1884) -FD_MNEMONIC(XSTORE,1885) -FD_MNEMONIC(XSUSLDTRK,1886) -FD_MNEMONIC(XTEST,1887) diff --git a/third_party/fadec/fadec-enc.h b/third_party/fadec/fadec-enc.h deleted file mode 100644 index 5505ed3..0000000 --- a/third_party/fadec/fadec-enc.h +++ /dev/null @@ -1,113 +0,0 @@ - -#ifndef FD_FADEC_ENC_H_ -#define FD_FADEC_ENC_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - FE_AX = 0x100, FE_CX, FE_DX, FE_BX, FE_SP, FE_BP, FE_SI, FE_DI, - FE_R8, FE_R9, FE_R10, FE_R11, FE_R12, FE_R13, FE_R14, FE_R15, - FE_IP = 0x120, - FE_AH = 0x204, FE_CH, FE_DH, FE_BH, - FE_ES = 0x300, FE_CS, FE_SS, FE_DS, FE_FS, FE_GS, - FE_ST0 = 0x400, FE_ST1, FE_ST2, FE_ST3, FE_ST4, FE_ST5, FE_ST6, FE_ST7, - FE_MM0 = 0x500, FE_MM1, FE_MM2, FE_MM3, FE_MM4, FE_MM5, FE_MM6, FE_MM7, - FE_XMM0 = 0x600, FE_XMM1, FE_XMM2, FE_XMM3, FE_XMM4, FE_XMM5, FE_XMM6, FE_XMM7, - FE_XMM8, FE_XMM9, FE_XMM10, FE_XMM11, FE_XMM12, FE_XMM13, FE_XMM14, FE_XMM15, - FE_XMM16, FE_XMM17, FE_XMM18, FE_XMM19, FE_XMM20, FE_XMM21, FE_XMM22, FE_XMM23, - FE_XMM24, FE_XMM25, FE_XMM26, FE_XMM27, FE_XMM28, FE_XMM29, FE_XMM30, FE_XMM31, - FE_K0 = 0x700, FE_K1, FE_K2, FE_K3, FE_K4, FE_K5, FE_K6, FE_K7, - FE_TMM0 = 0x800, FE_TMM1, FE_TMM2, FE_TMM3, FE_TMM4, FE_TMM5, FE_TMM6, FE_TMM7, -} FeReg; - -typedef int64_t FeOp; - -/** Construct a memory operand. Unused parts can be set to 0 and will be - * ignored. FE_IP can be used as base register, in which case the offset is - * interpreted as the offset from the /current/ position -- the size of the - * encoded instruction will be subtracted during encoding. scale must be 1, 2, - * 4, or 8; but is ignored if idx == 0. **/ -#define FE_MEM(base,sc,idx,off) (INT64_MIN | ((int64_t) ((base) & 0xfff) << 32) | ((int64_t) ((idx) & 0xfff) << 44) | ((int64_t) ((sc) & 0xf) << 56) | ((off) & 0xffffffff)) -#define FE_NOREG ((FeReg) 0) - -/** Add segment override prefix. This may or may not generate prefixes for the - * ignored prefixes ES/CS/DS/SS in 64-bit mode. **/ -#define FE_SEG(seg) ((uint64_t) (((seg) & 0x7) + 1) << 29) -/** Do not use. **/ -#define FE_SEG_MASK 0xe0000000 -/** Overrides address size. **/ -#define FE_ADDR32 0x10000000 -/** Used together with a RIP-relative (conditional) jump, this will force the - * use of the encoding with the largest distance. Useful for reserving a jump - * when the target offset is still unknown; if the jump is re-encoded later on, - * FE_JMPL must be specified there, too, so that the encoding lengths match. **/ -#define FE_JMPL 0x100000000 -#define FE_MASK(kreg) ((uint64_t) ((kreg) & 0x7) << 33) -#define FE_RC_RN 0x0000000 -#define FE_RC_RD 0x0800000 -#define FE_RC_RU 0x1000000 -#define FE_RC_RZ 0x1800000 - -enum { - FE_CC_O = 0x0, - FE_CC_NO = 0x1, - FE_CC_C = 0x2, - FE_CC_B = FE_CC_C, - FE_CC_NAE = FE_CC_C, - FE_CC_NC = 0x3, - FE_CC_AE = FE_CC_NC, - FE_CC_NB = FE_CC_NC, - FE_CC_Z = 0x4, - FE_CC_E = FE_CC_Z, - FE_CC_NZ = 0x5, - FE_CC_NE = FE_CC_NZ, - FE_CC_BE = 0x6, - FE_CC_NA = FE_CC_BE, - FE_CC_A = 0x7, - FE_CC_NBE = FE_CC_A, - FE_CC_S = 0x8, - FE_CC_NS = 0x9, - FE_CC_P = 0xa, - FE_CC_PE = FE_CC_P, - FE_CC_NP = 0xb, - FE_CC_PO = FE_CC_NP, - FE_CC_L = 0xc, - FE_CC_NGE = FE_CC_L, - FE_CC_GE = 0xd, - FE_CC_NL = FE_CC_GE, - FE_CC_LE = 0xe, - FE_CC_NG = FE_CC_LE, - FE_CC_G = 0xf, - FE_CC_NLE = FE_CC_G, -}; - -#include - -/** Do not use. **/ -#define fe_enc64_1(buf, mnem, op0, op1, op2, op3, ...) fe_enc64_impl(buf, mnem, op0, op1, op2, op3) -/** Encode a single instruction for 64-bit mode. - * \param buf Pointer to the buffer for instruction bytes, must have a size of - * 15 bytes. The pointer is advanced by the number of bytes used for - * encoding the specified instruction. - * \param mnem Mnemonic, optionally or-ed with FE_SEG(), FE_ADDR32, or FE_JMPL. - * \param operands... Instruction operands. Immediate operands are passed as - * plain value; register operands using the FeReg enum; memory operands - * using FE_MEM(); and offset operands for RIP-relative jumps/calls are - * specified as _address in buf_, e.g. (intptr_t) jmptgt, the address of - * buf and the size of the encoded instruction are subtracted internally. - * \return Zero for success or a negative value in case of an error. - **/ -#define fe_enc64(buf, ...) fe_enc64_1(buf, __VA_ARGS__, 0, 0, 0, 0, 0) -/** Do not use. **/ -int fe_enc64_impl(uint8_t** buf, uint64_t mnem, FeOp op0, FeOp op1, FeOp op2, FeOp op3); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third_party/fadec/fadec-enc2.h b/third_party/fadec/fadec-enc2.h deleted file mode 100644 index 1f76311..0000000 --- a/third_party/fadec/fadec-enc2.h +++ /dev/null @@ -1,226 +0,0 @@ - -#ifndef FD_FADEC_ENC2_H_ -#define FD_FADEC_ENC2_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -#define FE_STRUCT(name) name -#else -#define FE_STRUCT(name) (name) -#endif - -// Flags -#define FE_JMPL 0x8 -#define FE_ADDR32 0x10 -#define FE_SEG_MASK 0x7 -#define FE_SEG(seg) (((seg).idx + 1) & FE_SEG_MASK) -#define FE_RC_MASK 0x60 -#define FE_RC_RN 0x00 -#define FE_RC_RD 0x20 -#define FE_RC_RU 0x40 -#define FE_RC_RZ 0x60 - -// Condition codes -typedef enum FeCond { - FE_CC_O = 0x00000, - FE_CC_NO = 0x10000, - FE_CC_C = 0x20000, - FE_CC_B = FE_CC_C, - FE_CC_NAE = FE_CC_C, - FE_CC_NC = 0x30000, - FE_CC_AE = FE_CC_NC, - FE_CC_NB = FE_CC_NC, - FE_CC_Z = 0x40000, - FE_CC_E = FE_CC_Z, - FE_CC_NZ = 0x50000, - FE_CC_NE = FE_CC_NZ, - FE_CC_BE = 0x60000, - FE_CC_NA = FE_CC_BE, - FE_CC_A = 0x70000, - FE_CC_NBE = FE_CC_A, - FE_CC_S = 0x80000, - FE_CC_NS = 0x90000, - FE_CC_P = 0xa0000, - FE_CC_PE = FE_CC_P, - FE_CC_NP = 0xb0000, - FE_CC_PO = FE_CC_NP, - FE_CC_L = 0xc0000, - FE_CC_NGE = FE_CC_L, - FE_CC_GE = 0xd0000, - FE_CC_NL = FE_CC_GE, - FE_CC_LE = 0xe0000, - FE_CC_NG = FE_CC_LE, - FE_CC_G = 0xf0000, - FE_CC_NLE = FE_CC_G, - - FE_CC_MASK = 0xf0000 -} FeCond; - -typedef struct FeRegGP { unsigned char idx; } FeRegGP; -#define FE_GP(idx) (FE_STRUCT(FeRegGP) { idx }) -#define FE_AX FE_GP(0) -#define FE_CX FE_GP(1) -#define FE_DX FE_GP(2) -#define FE_BX FE_GP(3) -#define FE_SP FE_GP(4) -#define FE_BP FE_GP(5) -#define FE_SI FE_GP(6) -#define FE_DI FE_GP(7) -#define FE_R8 FE_GP(8) -#define FE_R9 FE_GP(9) -#define FE_R10 FE_GP(10) -#define FE_R11 FE_GP(11) -#define FE_R12 FE_GP(12) -#define FE_R13 FE_GP(13) -#define FE_R14 FE_GP(14) -#define FE_R15 FE_GP(15) -#define FE_IP FE_GP(0x20) -#define FE_NOREG FE_GP(0x80) -typedef struct FeRegGPH { unsigned char idx; } FeRegGPH; -#define FE_GPH(idx) (FE_STRUCT(FeRegGPH) { idx }) -#define FE_AH FE_GPH(4) -#define FE_CH FE_GPH(5) -#define FE_DH FE_GPH(6) -#define FE_BH FE_GPH(7) -typedef struct FeRegSREG { unsigned char idx; } FeRegSREG; -#define FE_SREG(idx) (FE_STRUCT(FeRegSREG) { idx }) -#define FE_ES FE_SREG(0) -#define FE_CS FE_SREG(1) -#define FE_SS FE_SREG(2) -#define FE_DS FE_SREG(3) -#define FE_FS FE_SREG(4) -#define FE_GS FE_SREG(5) -typedef struct FeRegST { unsigned char idx; } FeRegST; -#define FE_ST(idx) (FE_STRUCT(FeRegST) { idx }) -#define FE_ST0 FE_ST(0) -#define FE_ST1 FE_ST(1) -#define FE_ST2 FE_ST(2) -#define FE_ST3 FE_ST(3) -#define FE_ST4 FE_ST(4) -#define FE_ST5 FE_ST(5) -#define FE_ST6 FE_ST(6) -#define FE_ST7 FE_ST(7) -typedef struct FeRegMM { unsigned char idx; } FeRegMM; -#define FE_MM(idx) (FE_STRUCT(FeRegMM) { idx }) -#define FE_MM0 FE_MM(0) -#define FE_MM1 FE_MM(1) -#define FE_MM2 FE_MM(2) -#define FE_MM3 FE_MM(3) -#define FE_MM4 FE_MM(4) -#define FE_MM5 FE_MM(5) -#define FE_MM6 FE_MM(6) -#define FE_MM7 FE_MM(7) -typedef struct FeRegXMM { unsigned char idx; } FeRegXMM; -#define FE_XMM(idx) (FE_STRUCT(FeRegXMM) { idx }) -#define FE_XMM0 FE_XMM(0) -#define FE_XMM1 FE_XMM(1) -#define FE_XMM2 FE_XMM(2) -#define FE_XMM3 FE_XMM(3) -#define FE_XMM4 FE_XMM(4) -#define FE_XMM5 FE_XMM(5) -#define FE_XMM6 FE_XMM(6) -#define FE_XMM7 FE_XMM(7) -#define FE_XMM8 FE_XMM(8) -#define FE_XMM9 FE_XMM(9) -#define FE_XMM10 FE_XMM(10) -#define FE_XMM11 FE_XMM(11) -#define FE_XMM12 FE_XMM(12) -#define FE_XMM13 FE_XMM(13) -#define FE_XMM14 FE_XMM(14) -#define FE_XMM15 FE_XMM(15) -#define FE_XMM16 FE_XMM(16) -#define FE_XMM17 FE_XMM(17) -#define FE_XMM18 FE_XMM(18) -#define FE_XMM19 FE_XMM(19) -#define FE_XMM20 FE_XMM(20) -#define FE_XMM21 FE_XMM(21) -#define FE_XMM22 FE_XMM(22) -#define FE_XMM23 FE_XMM(23) -#define FE_XMM24 FE_XMM(24) -#define FE_XMM25 FE_XMM(25) -#define FE_XMM26 FE_XMM(26) -#define FE_XMM27 FE_XMM(27) -#define FE_XMM28 FE_XMM(28) -#define FE_XMM29 FE_XMM(29) -#define FE_XMM30 FE_XMM(30) -#define FE_XMM31 FE_XMM(31) -typedef struct FeRegMASK { unsigned char idx; } FeRegMASK; -#define FE_K(idx) (FE_STRUCT(FeRegMASK) { idx }) -#define FE_K0 FE_K(0) -#define FE_K1 FE_K(1) -#define FE_K2 FE_K(2) -#define FE_K3 FE_K(3) -#define FE_K4 FE_K(4) -#define FE_K5 FE_K(5) -#define FE_K6 FE_K(6) -#define FE_K7 FE_K(7) -typedef struct FeRegTMM { unsigned char idx; } FeRegTMM; -#define FE_TMM(idx) (FE_STRUCT(FeRegTMM) { idx }) -#define FE_TMM0 FE_TMM(0) -#define FE_TMM1 FE_TMM(1) -#define FE_TMM2 FE_TMM(2) -#define FE_TMM3 FE_TMM(3) -#define FE_TMM4 FE_TMM(4) -#define FE_TMM5 FE_TMM(5) -#define FE_TMM6 FE_TMM(6) -#define FE_TMM7 FE_TMM(7) -typedef struct FeRegCR { unsigned char idx; } FeRegCR; -#define FE_CR(idx) (FE_STRUCT(FeRegCR) { idx }) -typedef struct FeRegDR { unsigned char idx; } FeRegDR; -#define FE_DR(idx) (FE_STRUCT(FeRegDR) { idx }) - -// Internal only -// Disambiguate GP and GPH -- C++ uses conversion constructors; C uses _Generic. -#ifdef __cplusplus -} -namespace { - struct FeRegGPLH { - unsigned char idx; - FeRegGPLH(FeRegGP gp) : idx(gp.idx) {} - FeRegGPLH(FeRegGPH gp) : idx(gp.idx | 0x20) {} - }; -} -extern "C" { -#define FE_MAKE_GPLH(reg) reg -#else -typedef struct FeRegGPLH { unsigned char idx; } FeRegGPLH; -#define FE_GPLH(idx) (FE_STRUCT(FeRegGPLH) { idx }) -#define FE_MAKE_GPLH(reg) FE_GPLH(_Generic((reg), FeRegGPH: 0x20, FeRegGP: 0) | (reg).idx) -#endif - -typedef struct FeMem { - uint8_t flags; - FeRegGP base; - unsigned char scale; - // union { - FeRegGP idx; - // FeRegXMM idx_xmm; - // }; - int32_t off; -} FeMem; -#define FE_MEM(base,sc,idx,off) (FE_STRUCT(FeMem) { 0, base, sc, idx, off }) -typedef struct FeMemV { - uint8_t flags; - FeRegGP base; - unsigned char scale; - FeRegXMM idx; - int32_t off; -} FeMemV; -#define FE_MEMV(base,sc,idx,off) (FE_STRUCT(FeMemV) { 0, base, sc, idx, off }) - -// NOP is special: flags is interpreted as the length in bytes, 0 = 1 byte, too. -unsigned fe64_NOP(uint8_t* buf, unsigned flags); - -#include - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third_party/fadec/fadec.h b/third_party/fadec/fadec.h deleted file mode 100644 index 2271e5a..0000000 --- a/third_party/fadec/fadec.h +++ /dev/null @@ -1,286 +0,0 @@ - -#ifndef FD_FADEC_H_ -#define FD_FADEC_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - FD_REG_R0 = 0, FD_REG_R1, FD_REG_R2, FD_REG_R3, - FD_REG_R4, FD_REG_R5, FD_REG_R6, FD_REG_R7, - FD_REG_R8, FD_REG_R9, FD_REG_R10, FD_REG_R11, - FD_REG_R12, FD_REG_R13, FD_REG_R14, FD_REG_R15, - // Alternative names for byte registers - FD_REG_AL = 0, FD_REG_CL, FD_REG_DL, FD_REG_BL, - FD_REG_AH, FD_REG_CH, FD_REG_DH, FD_REG_BH, - // Alternative names for general purpose registers - FD_REG_AX = 0, FD_REG_CX, FD_REG_DX, FD_REG_BX, - FD_REG_SP, FD_REG_BP, FD_REG_SI, FD_REG_DI, - // FD_REG_IP can only be accessed in long mode (64-bit) - FD_REG_IP = 0x10, - // Segment register values - FD_REG_ES = 0, FD_REG_CS, FD_REG_SS, FD_REG_DS, FD_REG_FS, FD_REG_GS, - // No register specified - FD_REG_NONE = 0x3f -} FdReg; - -typedef enum { -#define FD_MNEMONIC(name,value) FDI_ ## name = value, -#include -#undef FD_MNEMONIC -} FdInstrType; - -/** Internal use only. **/ -enum { - FD_FLAG_LOCK = 1 << 0, - FD_FLAG_REP = 1 << 2, - FD_FLAG_REPNZ = 1 << 1, - FD_FLAG_64 = 1 << 7, -}; - -/** Operand types. **/ -typedef enum { - FD_OT_NONE = 0, - FD_OT_REG = 1, - FD_OT_IMM = 2, - FD_OT_MEM = 3, - FD_OT_OFF = 4, - FD_OT_MEMBCST = 5, -} FdOpType; - -typedef enum { - /** Vector (SSE/AVX) register XMMn/YMMn/ZMMn **/ - FD_RT_VEC = 0, - /** Low general purpose register **/ - FD_RT_GPL = 1, - /** High-byte general purpose register **/ - FD_RT_GPH = 2, - /** Segment register **/ - FD_RT_SEG = 3, - /** FPU register ST(n) **/ - FD_RT_FPU = 4, - /** MMX register MMn **/ - FD_RT_MMX = 5, - /** TMM register TMMn **/ - FD_RT_TMM = 6, - /** Vector mask (AVX-512) register Kn **/ - FD_RT_MASK = 7, - /** Bound register BNDn **/ - FD_RT_BND = 8, - /** Control Register CRn **/ - FD_RT_CR = 9, - /** Debug Register DRn **/ - FD_RT_DR = 10, - /** Must be a memory operand **/ - FD_RT_MEM = 15, -} FdRegType; - -/** Do not depend on the actual enum values. **/ -typedef enum { - /** Round to nearest (even) **/ - FD_RC_RN = 1, - /** Round down **/ - FD_RC_RD = 3, - /** Round up **/ - FD_RC_RU = 5, - /** Round to zero (truncate) **/ - FD_RC_RZ = 7, - /** Rounding mode as specified in MXCSR **/ - FD_RC_MXCSR = 0, - /** Rounding mode irrelevant, but SAE **/ - FD_RC_SAE = 6, -} FdRoundControl; - -/** Internal use only. **/ -typedef struct { - uint8_t type; - uint8_t size; - uint8_t reg; - uint8_t misc; -} FdOp; - -/** Never(!) access struct fields directly. Use the macros defined below. **/ -typedef struct { - uint16_t type; - uint8_t flags; - uint8_t segment; - uint8_t addrsz; - uint8_t operandsz; - uint8_t size; - uint8_t evex; - - FdOp operands[4]; - - int64_t disp; - int64_t imm; - - uint64_t address; -} FdInstr; - -typedef enum { - FD_ERR_UD = -1, - FD_ERR_INTERNAL = -2, - FD_ERR_PARTIAL = -3, -} FdErr; - - -/** Decode an instruction. - * \param buf Buffer for instruction bytes. - * \param len Length of the buffer (in bytes). An instruction is not longer than - * 15 bytes on all x86 architectures. - * \param mode Decoding mode, either 32 for protected/compatibility mode or 64 - * for long mode. 16-bit mode is not supported. - * \param address Virtual address where the decoded instruction. This is used - * for computing jump targets. If "0" is passed, operands which require - * adding EIP/RIP will be stored as FD_OT_OFF operands. - * DEPRECATED: Strongly prefer passing 0 and using FD_OT_OFF operands. - * \param out_instr Pointer to the instruction buffer. Note that this may get - * partially written even if an error is returned. - * \return The number of bytes consumed by the instruction, or a negative number - * indicating an error. - **/ -int fd_decode(const uint8_t* buf, size_t len, int mode, uintptr_t address, - FdInstr* out_instr); - -/** Format an instruction to a string. - * \param instr The instruction. - * \param buf The buffer to hold the formatted string. - * \param len The length of the buffer. - **/ -void fd_format(const FdInstr* instr, char* buf, size_t len); - -/** Format an instruction to a string. - * NOTE: API stability is currently not guaranteed for this function; its name - * and/or signature may change in future. - * - * \param instr The instruction. - * \param addr The base address to use for printing FD_OT_OFF operands. - * \param buf The buffer to hold the formatted string. - * \param len The length of the buffer. - **/ -void fd_format_abs(const FdInstr* instr, uint64_t addr, char* buf, size_t len); - -/** Get the stringified name of an instruction type. - * NOTE: API stability is currently not guaranteed for this function; changes - * to the signature and/or the returned string can be expected. E.g., a future - * version may take an extra parameter for the instruction operand size; or may - * take a complete decoded instruction as first parameter and return the - * mnemonic returned by fd_format. - * - * \param ty An instruction type - * \return The instruction type as string, or "(invalid)". - **/ -const char* fdi_name(FdInstrType ty); - - -/** Gets the type/mnemonic of the instruction. - * ABI STABILITY NOTE: different versions or builds of the library may use - * different values. When linking as shared library, any interpretation of this - * value is meaningless; in such cases use fdi_name. - * - * API STABILITY NOTE: a future version of this library may decode string - * instructions prefixed with REP/REPNZ and instructions prefixed with LOCK as - * separate instruction types. **/ -#define FD_TYPE(instr) ((FdInstrType) (instr)->type) -/** DEPRECATED: This functionality is obsolete in favor of FD_OT_OFF. - * Gets the address of the instruction. Invalid if decoded address == 0. **/ -#define FD_ADDRESS(instr) ((instr)->address) -/** Gets the size of the instruction in bytes. **/ -#define FD_SIZE(instr) ((instr)->size) -/** Gets the specified segment override, or FD_REG_NONE for default segment. **/ -#define FD_SEGMENT(instr) ((FdReg) (instr)->segment & 0x3f) -/** Gets the address size attribute of the instruction in bytes. **/ -#define FD_ADDRSIZE(instr) (1 << (instr)->addrsz) -/** Get the logarithmic address size; FD_ADDRSIZE == 1 << FD_ADDRSIZELG **/ -#define FD_ADDRSIZELG(instr) ((instr)->addrsz) -/** Gets the operation width in bytes of the instruction if this is not encoded - * in the operands, for example for the string instruction (e.g. MOVS). **/ -#define FD_OPSIZE(instr) (1 << (instr)->operandsz) -/** Get the logarithmic operand size; FD_OPSIZE == 1 << FD_OPSIZELG iff - * FD_OPSIZE is valid. **/ -#define FD_OPSIZELG(instr) ((instr)->operandsz) -/** Indicates whether the instruction was encoded with a REP prefix. Needed for: - * (1) Handling the instructions MOVS, STOS, LODS, INS and OUTS properly. - * (2) Handling the instructions SCAS and CMPS, for which this means REPZ. **/ -#define FD_HAS_REP(instr) ((instr)->flags & FD_FLAG_REP) -/** Indicates whether the instruction was encoded with a REPNZ prefix. **/ -#define FD_HAS_REPNZ(instr) ((instr)->flags & FD_FLAG_REPNZ) -/** Indicates whether the instruction was encoded with a LOCK prefix. **/ -#define FD_HAS_LOCK(instr) ((instr)->flags & FD_FLAG_LOCK) -/** Do not use. **/ -#define FD_IS64(instr) ((instr)->flags & FD_FLAG_64) - -/** Gets the type of an operand at the given index. **/ -#define FD_OP_TYPE(instr,idx) ((FdOpType) (instr)->operands[idx].type) -/** Gets the size in bytes of an operand. However, there are a few exceptions: - * (1) For some register types, e.g., segment registers, or x87 registers, the - * size is zero. (This allows some simplifications internally.) - * (2) On some vector instructions this may be only an approximation of the - * actually needed operand size (that is, an instruction may/must only use - * a smaller part than specified here). The real operand size is always - * fully recoverable in combination with the instruction type. **/ -#define FD_OP_SIZE(instr,idx) (1 << (instr)->operands[idx].size >> 1) -/** Get the logarithmic size of an operand; see FD_OP_SIZE for special cases. - * The following equality holds: FD_OP_SIZE == 1 << (FD_OP_SIZELG + 1) >> 1 - * Note that typically FD_OP_SIZE == 1 << FD_OP_SIZELG unless a zero-sized - * memory operand, FPU register, or mask register is involved. **/ -#define FD_OP_SIZELG(instr,idx) ((instr)->operands[idx].size - 1) -/** Gets the accessed register index of a register operand. Note that /only/ the - * index is returned, no further interpretation of the index (which depends on - * the instruction type) is done. The register type can be fetched using - * FD_OP_REG_TYPE, e.g. for distinguishing high-byte registers. - * Only valid if FD_OP_TYPE == FD_OT_REG **/ -#define FD_OP_REG(instr,idx) ((FdReg) (instr)->operands[idx].reg) -/** Gets the type of the accessed register. - * Only valid if FD_OP_TYPE == FD_OT_REG **/ -#define FD_OP_REG_TYPE(instr,idx) ((FdRegType) (instr)->operands[idx].misc) -/** DEPRECATED: use FD_OP_REG_TYPE() == FD_RT_GPH instead. - * Returns whether the accessed register is a high-byte register. In that case, - * the register index has to be decreased by 4. - * Only valid if FD_OP_TYPE == FD_OT_REG **/ -#define FD_OP_REG_HIGH(instr,idx) (FD_OP_REG_TYPE(instr,idx) == FD_RT_GPH) -/** Gets the index of the base register from a memory operand, or FD_REG_NONE, - * if the memory operand has no base register. This is the only case where the - * 64-bit register RIP can be returned, in which case the operand also has no - * scaled index register. - * Only valid if FD_OP_TYPE == FD_OT_MEM/MEMBCST **/ -#define FD_OP_BASE(instr,idx) ((FdReg) (instr)->operands[idx].reg) -/** Gets the index of the index register from a memory operand, or FD_REG_NONE, - * if the memory operand has no scaled index register. - * Only valid if FD_OP_TYPE == FD_OT_MEM/MEMBCST **/ -#define FD_OP_INDEX(instr,idx) ((FdReg) (instr)->operands[idx].misc & 0x3f) -/** Gets the scale of the index register from a memory operand when existent. - * This does /not/ return the scale in an absolute value but returns the amount - * of bits the index register is shifted to the left (i.e. the value in in the - * range 0-3). The actual scale can be computed easily using 1<operands[idx].misc >> 6) -/** Gets the sign-extended displacement of a memory operand. - * Only valid if FD_OP_TYPE == FD_OT_MEM/MEMBCST **/ -#define FD_OP_DISP(instr,idx) ((int64_t) (instr)->disp) -/** Get memory broadcast size in bytes. - * Only valid if FD_OP_TYPE == FD_OT_MEMBCST **/ -#define FD_OP_BCSTSZ(instr,idx) (1 << FD_OP_BCSTSZLG(instr,idx)) -/** Get logarithmic memory broadcast size (1 = 2-byte; 2=4-byte; 3=8-byte). - * Only valid if FD_OP_TYPE == FD_OT_MEMBCST **/ -#define FD_OP_BCSTSZLG(instr,idx) ((instr)->segment >> 6) -/** Gets the (sign-extended) encoded constant for an immediate operand. - * Only valid if FD_OP_TYPE == FD_OT_IMM or FD_OP_TYPE == FD_OT_OFF **/ -#define FD_OP_IMM(instr,idx) ((instr)->imm) - -/** Get the opmask register for EVEX-encoded instructions; 0 for no mask. **/ -#define FD_MASKREG(instr) ((instr)->evex & 0x07) -/** Get whether zero masking shall be used. Only valid if FD_MASKREG != 0. **/ -#define FD_MASKZERO(instr) ((instr)->evex & 0x80) -/** Get rounding mode for EVEX-encoded instructions. See FdRoundControl. **/ -#define FD_ROUNDCONTROL(instr) ((FdRoundControl) (((instr)->evex & 0x70) >> 4)) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/third_party/fadec/format.c b/third_party/fadec/format.c deleted file mode 100644 index a25f13c..0000000 --- a/third_party/fadec/format.c +++ /dev/null @@ -1,563 +0,0 @@ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif - -#include - - -#ifdef __GNUC__ -#define LIKELY(x) __builtin_expect(!!(x), 1) -#define UNLIKELY(x) __builtin_expect(!!(x), 0) -#define DECLARE_ARRAY_SIZE(n) static n -#define DECLARE_RESTRICTED_ARRAY_SIZE(n) restrict static n -#else -#define LIKELY(x) (x) -#define UNLIKELY(x) (x) -#define DECLARE_ARRAY_SIZE(n) n -#define DECLARE_RESTRICTED_ARRAY_SIZE(n) n -#endif - -#if defined(__has_attribute) -#if __has_attribute(fallthrough) -#define FALLTHROUGH() __attribute__((fallthrough)) -#endif -#endif -#if !defined(FALLTHROUGH) -#define FALLTHROUGH() ((void)0) -#endif - -struct FdStr { - const char* s; - unsigned sz; -}; - -#define fd_stre(s) ((struct FdStr) { (s "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"), sizeof (s)-1 }) - -static char* -fd_strpcat(char* restrict dst, struct FdStr src) { -#ifdef __GNUC__ - unsigned lim = __builtin_constant_p(src.sz) && src.sz <= 8 ? 8 : 16; -#else - unsigned lim = 16; -#endif - for (unsigned i = 0; i < lim; i++) - dst[i] = src.s[i]; - // __builtin_memcpy(dst, src.s, 16); - return dst + src.sz; -} - -static unsigned -fd_clz64(uint64_t v) { -#if defined(__GNUC__) - return __builtin_clzll(v); -#elif defined(_MSC_VER) - unsigned long index; - - // 32-bit MSVC doesn't support _BitScanReverse64. This is an attempt to - // identify this case. -#if INTPTR_MAX == INT64_MAX - _BitScanReverse64(&index, v); -#else - if (_BitScanReverse(&index, v >> 32)) - return 31 - index; - - _BitScanReverse(&index, v & 0xffffffff); -#endif - - return 63 - index; -#else -#error Unsupported compiler. -#endif -} - -#if defined(__SSE2__) -#include -#endif - -static char* -fd_strpcatnum(char dst[DECLARE_ARRAY_SIZE(18)], uint64_t val) { - unsigned lz = fd_clz64(val|1); - unsigned numbytes = 16 - (lz / 4); -#if defined(__SSE2__) - __m128i mv = _mm_set_epi64x(0, val << (lz & -4)); - __m128i mvp = _mm_unpacklo_epi8(mv, mv); - __m128i mva = _mm_srli_epi16(mvp, 12); - __m128i mvb = _mm_and_si128(mvp, _mm_set1_epi16(0x0f00u)); - __m128i ml = _mm_or_si128(mva, mvb); - __m128i mn = _mm_or_si128(ml, _mm_set1_epi8(0x30)); - __m128i mgt = _mm_cmpgt_epi8(ml, _mm_set1_epi8(9)); - __m128i mgtm = _mm_and_si128(mgt, _mm_set1_epi8(0x61 - 0x3a)); - __m128i ma = _mm_add_epi8(mn, mgtm); - __m128i msw = _mm_shufflehi_epi16(_mm_shufflelo_epi16(ma, 0x1b), 0x1b); - __m128i ms = _mm_shuffle_epi32(msw, 0x4e); - _mm_storeu_si128((__m128i_u*) (dst + 2), ms); -#else - unsigned idx = numbytes + 2; - do { - dst[--idx] = "0123456789abcdef"[val % 16]; - val /= 16; - } while (val); -#endif - dst[0] = '0'; - dst[1] = 'x'; - return dst + numbytes + 2; -} - -static char* -fd_strpcatreg(char* restrict dst, size_t rt, size_t ri, unsigned size) { - const char* nametab = - "\2al\4bnd0\2cl\4bnd1\2dl\4bnd2\2bl\4bnd3" - "\3spl\0 \3bpl\0 \3sil\0 \3dil\0 " - "\3r8b\0 \3r9b\0 \4r10b\0 \4r11b\0 " - "\4r12b\2ah\4r13b\2ch\4r14b\2dh\4r15b\2bh\0\0 " - - "\2ax\4tmm0\2cx\4tmm1\2dx\4tmm2\2bx\4tmm3" - "\2sp\4tmm4\2bp\4tmm5\2si\4tmm6\2di\4tmm7" - "\3r8w \2es\3r9w \2cs\4r10w\2ss\4r11w\2ds" - "\4r12w\2fs\4r13w\2gs\4r14w\0 \4r15w\0 \2ip\0 " - - "\3eax\3mm0\3ecx\3mm1\3edx\3mm2\3ebx\3mm3" - "\3esp\3mm4\3ebp\3mm5\3esi\3mm6\3edi\3mm7" - "\3r8d \2k0\3r9d \2k1\4r10d\2k2\4r11d\2k3" - "\4r12d\2k4\4r13d\2k5\4r14d\2k6\4r15d\2k7\3eip\0 " - - "\3rax\3cr0\3rcx\0 \3rdx\3cr2\3rbx\3cr3" - "\3rsp\3cr4\3rbp\0 \3rsi\0 \3rdi\0 " - "\2r8 \3cr8\2r9 \3dr0\3r10\3dr1\3r11\3dr2" - "\3r12\3dr3\3r13\3dr4\3r14\3dr5\3r15\3dr6\3rip\3dr7" - - "\5st(0)\0 \5st(1)\0 \5st(2)\0 \5st(3)\0 " - "\5st(4)\0 \5st(5)\0 \5st(6)\0 \5st(7)\0 " - - "\4xmm0\0 \4xmm1\0 \4xmm2\0 \4xmm3\0 " - "\4xmm4\0 \4xmm5\0 \4xmm6\0 \4xmm7\0 " - "\4xmm8\0 \4xmm9\0 \5xmm10\0 \5xmm11\0 " - "\5xmm12\0 \5xmm13\0 \5xmm14\0 \5xmm15\0 " - "\5xmm16\0 \5xmm17\0 \5xmm18\0 \5xmm19\0 " - "\5xmm20\0 \5xmm21\0 \5xmm22\0 \5xmm23\0 " - "\5xmm24\0 \5xmm25\0 \5xmm26\0 \5xmm27\0 " - "\5xmm28\0 \5xmm29\0 \5xmm30\0 \5xmm31\0 "; - - static const uint16_t nametabidx[] = { - [FD_RT_GPL] = 0 * 17*8 + 0 * 8 + 0, - [FD_RT_GPH] = 0 * 17*8 + 8 * 8 + 5, - [FD_RT_SEG] = 1 * 17*8 + 8 * 8 + 5, - [FD_RT_FPU] = 4 * 17*8 + 0 * 8 + 0, - [FD_RT_MMX] = 2 * 17*8 + 0 * 8 + 4, - [FD_RT_VEC] = 4 * 17*8 + 8 * 8 + 0, - [FD_RT_MASK]= 2 * 17*8 + 8 * 8 + 5, - [FD_RT_BND] = 0 * 17*8 + 0 * 8 + 3, - [FD_RT_CR] = 3 * 17*8 + 0 * 8 + 4, - [FD_RT_DR] = 3 * 17*8 + 9 * 8 + 4, - [FD_RT_TMM] = 1 * 17*8 + 0 * 8 + 3, - }; - - unsigned idx = rt == FD_RT_GPL ? size * 17*8 : nametabidx[rt]; - const char* name = nametab + idx + 8*ri; - for (unsigned i = 0; i < 8; i++) - dst[i] = name[i+1]; - if (UNLIKELY(rt == FD_RT_VEC && size > 4)) - dst[0] += size - 4; - return dst + *name; -} - -const char* -fdi_name(FdInstrType ty) { - (void) ty; - return "(invalid)"; -} - -static char* -fd_mnemonic(char buf[DECLARE_RESTRICTED_ARRAY_SIZE(48)], const FdInstr* instr) { -#define FD_DECODE_TABLE_STRTAB1 - static const char* mnemonic_str = -#include - // 20 NULL Bytes to prevent out-of-bounds reads - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -#undef FD_DECODE_TABLE_STRTAB1 - -#define FD_DECODE_TABLE_STRTAB2 - static const uint16_t mnemonic_offs[] = { -#include - }; -#undef FD_DECODE_TABLE_STRTAB2 - -#define FD_DECODE_TABLE_STRTAB3 - static const uint8_t mnemonic_lens[] = { -#include - }; -#undef FD_DECODE_TABLE_STRTAB3 - - const char* mnem = &mnemonic_str[mnemonic_offs[FD_TYPE(instr)]]; - unsigned mnemlen = mnemonic_lens[FD_TYPE(instr)]; - - bool prefix_xacq_xrel = false; - bool prefix_segment = false; - - char sizesuffix[4] = {0}; - unsigned sizesuffixlen = 0; - - if (UNLIKELY(FD_OP_TYPE(instr, 0) == FD_OT_OFF && FD_OP_SIZELG(instr, 0) == 1)) - sizesuffix[0] = 'w', sizesuffixlen = 1; - - switch (FD_TYPE(instr)) { - case FDI_C_SEP: - mnem += FD_OPSIZE(instr) & 0xc; - mnemlen = 3; - break; - case FDI_C_EX: - mnem += FD_OPSIZE(instr) & 0xc; - mnemlen = FD_OPSIZE(instr) < 4 ? 3 : 4; - break; - case FDI_CMPXCHGD: - switch (FD_OPSIZELG(instr)) { - default: break; - case 2: sizesuffix[0] = '8', sizesuffix[1] = 'b', sizesuffixlen = 2; break; - case 3: sizesuffix[0] = '1', sizesuffix[1] = '6', sizesuffix[2] = 'b', sizesuffixlen = 3; break; - } - break; - case FDI_JCXZ: - mnemlen = FD_ADDRSIZELG(instr) == 1 ? 4 : 5; - mnem += 5 * (FD_ADDRSIZELG(instr) - 1); - break; - case FDI_PUSH: - if (FD_OP_SIZELG(instr, 0) == 1 && FD_OP_TYPE(instr, 0) == FD_OT_IMM) - sizesuffix[0] = 'w', sizesuffixlen = 1; - FALLTHROUGH(); - case FDI_POP: - if (FD_OP_SIZELG(instr, 0) == 1 && FD_OP_TYPE(instr, 0) == FD_OT_REG && - FD_OP_REG_TYPE(instr, 0) == FD_RT_SEG) - sizesuffix[0] = 'w', sizesuffixlen = 1; - break; - case FDI_XCHG: - if (FD_OP_TYPE(instr, 0) == FD_OT_MEM) - prefix_xacq_xrel = true; - break; - case FDI_MOV: - // MOV C6h/C7h can have XRELEASE prefix. - if (FD_HAS_REP(instr) && FD_OP_TYPE(instr, 0) == FD_OT_MEM && - FD_OP_TYPE(instr, 1) == FD_OT_IMM) - prefix_xacq_xrel = true; - break; - case FDI_FXSAVE: - case FDI_FXRSTOR: - case FDI_XSAVE: - case FDI_XSAVEC: - case FDI_XSAVEOPT: - case FDI_XSAVES: - case FDI_XRSTOR: - case FDI_XRSTORS: - if (FD_OPSIZELG(instr) == 3) - sizesuffix[0] = '6', sizesuffix[1] = '4', sizesuffixlen = 2; - break; - case FDI_EVX_MOV_G2X: - case FDI_EVX_MOV_X2G: - case FDI_EVX_PEXTR: - sizesuffix[0] = "bwdq"[FD_OP_SIZELG(instr, 0)]; - sizesuffixlen = 1; - break; - case FDI_EVX_PBROADCAST: - sizesuffix[0] = "bwdq"[FD_OP_SIZELG(instr, 1)]; - sizesuffixlen = 1; - break; - case FDI_EVX_PINSR: - sizesuffix[0] = "bwdq"[FD_OP_SIZELG(instr, 2)]; - sizesuffixlen = 1; - break; - case FDI_RET: - case FDI_ENTER: - case FDI_LEAVE: - if (FD_OPSIZELG(instr) == 1) - sizesuffix[0] = 'w', sizesuffixlen = 1; - break; - case FDI_LODS: - case FDI_MOVS: - case FDI_CMPS: - case FDI_OUTS: - prefix_segment = true; - FALLTHROUGH(); - case FDI_STOS: - case FDI_SCAS: - case FDI_INS: - if (FD_HAS_REP(instr)) - buf = fd_strpcat(buf, fd_stre("rep ")); - if (FD_HAS_REPNZ(instr)) - buf = fd_strpcat(buf, fd_stre("repnz ")); - if (FD_IS64(instr) && FD_ADDRSIZELG(instr) == 2) - buf = fd_strpcat(buf, fd_stre("addr32 ")); - if (!FD_IS64(instr) && FD_ADDRSIZELG(instr) == 1) - buf = fd_strpcat(buf, fd_stre("addr16 ")); - FALLTHROUGH(); - case FDI_IN: - case FDI_OUT: - if (FD_OP_TYPE(instr, 0) != FD_OT_NONE) - break; - FALLTHROUGH(); - case FDI_PUSHA: - case FDI_POPA: - case FDI_PUSHF: - case FDI_POPF: - case FDI_RETF: - case FDI_IRET: - sizesuffix[0] = "bwdq"[FD_OPSIZELG(instr)]; - sizesuffixlen = 1; - break; - default: break; - } - - if (UNLIKELY(prefix_xacq_xrel || FD_HAS_LOCK(instr))) { - if (FD_HAS_REP(instr)) - buf = fd_strpcat(buf, fd_stre("xrelease ")); - if (FD_HAS_REPNZ(instr)) - buf = fd_strpcat(buf, fd_stre("xacquire ")); - } - if (UNLIKELY(FD_HAS_LOCK(instr))) - buf = fd_strpcat(buf, fd_stre("lock ")); - if (UNLIKELY(prefix_segment && FD_SEGMENT(instr) != FD_REG_NONE)) { - *buf++ = "ecsdfg\0"[FD_SEGMENT(instr) & 7]; - *buf++ = 's'; - *buf++ = ' '; - } - - for (unsigned i = 0; i < 20; i++) - buf[i] = mnem[i]; - buf += mnemlen; - for (unsigned i = 0; i < 4; i++) - buf[i] = sizesuffix[i]; - buf += sizesuffixlen; - - return buf; -} - -static char* -fd_format_impl(char buf[DECLARE_RESTRICTED_ARRAY_SIZE(128)], const FdInstr* instr, uint64_t addr) { - buf = fd_mnemonic(buf, instr); - - for (int i = 0; i < 4; i++) - { - FdOpType op_type = FD_OP_TYPE(instr, i); - if (op_type == FD_OT_NONE) - break; - if (i > 0) - *buf++ = ','; - *buf++ = ' '; - - int size = FD_OP_SIZELG(instr, i); - - if (op_type == FD_OT_REG) { - unsigned type = FD_OP_REG_TYPE(instr, i); - unsigned idx = FD_OP_REG(instr, i); - buf = fd_strpcatreg(buf, type, idx, size); - } else if (op_type == FD_OT_MEM || op_type == FD_OT_MEMBCST) { - unsigned idx_rt = FD_RT_GPL; - unsigned idx_sz = FD_ADDRSIZELG(instr); - switch (FD_TYPE(instr)) { - case FDI_CMPXCHGD: size = FD_OPSIZELG(instr) + 1; break; - case FDI_BOUND: size += 1; break; - case FDI_JMPF: - case FDI_CALLF: - case FDI_LDS: - case FDI_LES: - case FDI_LFS: - case FDI_LGS: - case FDI_LSS: - size += 6; - break; - case FDI_FLD: - case FDI_FSTP: - case FDI_FBLD: - case FDI_FBSTP: - size = size >= 0 ? size : 9; - break; - case FDI_VPGATHERQD: - case FDI_VGATHERQPS: - case FDI_EVX_PGATHERQD: - case FDI_EVX_GATHERQPS: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 0) + 1; - break; - case FDI_EVX_PSCATTERQD: - case FDI_EVX_SCATTERQPS: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 1) + 1; - break; - case FDI_VPGATHERDQ: - case FDI_VGATHERDPD: - case FDI_EVX_PGATHERDQ: - case FDI_EVX_GATHERDPD: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 0) - 1; - break; - case FDI_EVX_PSCATTERDQ: - case FDI_EVX_SCATTERDPD: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 1) - 1; - break; - case FDI_VPGATHERDD: - case FDI_VPGATHERQQ: - case FDI_VGATHERDPS: - case FDI_VGATHERQPD: - case FDI_EVX_PGATHERDD: - case FDI_EVX_PGATHERQQ: - case FDI_EVX_GATHERDPS: - case FDI_EVX_GATHERQPD: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 0); - break; - case FDI_EVX_PSCATTERDD: - case FDI_EVX_PSCATTERQQ: - case FDI_EVX_SCATTERDPS: - case FDI_EVX_SCATTERQPD: - idx_rt = FD_RT_VEC; - idx_sz = FD_OP_SIZELG(instr, 1); - break; - default: break; - } - - if (op_type == FD_OT_MEMBCST) - size = FD_OP_BCSTSZLG(instr, i); - - const char* ptrsizes = - "\00 " - "\11byte ptr " - "\11word ptr " - "\12dword ptr " - "\12qword ptr " - "\14xmmword ptr " - "\14ymmword ptr " - "\14zmmword ptr " - "\12dword ptr " // far ptr; word + 2 - "\12fword ptr " // far ptr; dword + 2 - "\12tbyte ptr "; // far ptr/FPU; qword + 2 - const char* ptrsize = ptrsizes + 16 * (size + 1); - buf = fd_strpcat(buf, (struct FdStr) { ptrsize+1, *ptrsize }); - - unsigned seg = FD_SEGMENT(instr); - if (seg != FD_REG_NONE) { - *buf++ = "ecsdfg\0"[seg & 7]; - *buf++ = 's'; - *buf++ = ':'; - } - *buf++ = '['; - - bool has_base = FD_OP_BASE(instr, i) != FD_REG_NONE; - bool has_idx = FD_OP_INDEX(instr, i) != FD_REG_NONE; - if (has_base) - buf = fd_strpcatreg(buf, FD_RT_GPL, FD_OP_BASE(instr, i), FD_ADDRSIZELG(instr)); - if (has_idx) { - if (has_base) - *buf++ = '+'; - *buf++ = '0' + (1 << FD_OP_SCALE(instr, i)); - *buf++ = '*'; - buf = fd_strpcatreg(buf, idx_rt, FD_OP_INDEX(instr, i), idx_sz); - } - uint64_t disp = FD_OP_DISP(instr, i); - if (disp && (has_base || has_idx)) { - *buf++ = (int64_t) disp < 0 ? '-' : '+'; - if ((int64_t) disp < 0) - disp = -disp; - } - if (FD_ADDRSIZELG(instr) == 1) - disp &= 0xffff; - else if (FD_ADDRSIZELG(instr) == 2) - disp &= 0xffffffff; - if (disp || (!has_base && !has_idx)) - buf = fd_strpcatnum(buf, disp); - *buf++ = ']'; - - if (UNLIKELY(op_type == FD_OT_MEMBCST)) { - // {1toX}, X = FD_OP_SIZE(instr, i) / BCSTSZ (=> 2/4/8/16/32) - unsigned bcstszidx = FD_OP_SIZELG(instr, i) - FD_OP_BCSTSZLG(instr, i) - 1; - const char* bcstsizes = "\6{1to2} \6{1to4} \6{1to8} \7{1to16}\7{1to32} "; - const char* bcstsize = bcstsizes + bcstszidx * 8; - buf = fd_strpcat(buf, (struct FdStr) { bcstsize+1, *bcstsize }); - } - } else if (op_type == FD_OT_IMM || op_type == FD_OT_OFF) { - uint64_t immediate = FD_OP_IMM(instr, i); - // Some instructions have actually two immediate operands which are - // decoded as a single operand. Split them here appropriately. - switch (FD_TYPE(instr)) { - default: - goto nosplitimm; - case FDI_SSE_EXTRQ: - case FDI_SSE_INSERTQ: - buf = fd_strpcatnum(buf, immediate & 0xff); - buf = fd_strpcat(buf, fd_stre(", ")); - immediate = (immediate >> 8) & 0xff; - break; - case FDI_ENTER: - buf = fd_strpcatnum(buf, immediate & 0xffff); - buf = fd_strpcat(buf, fd_stre(", ")); - immediate = (immediate >> 16) & 0xff; - break; - case FDI_JMPF: - case FDI_CALLF: - buf = fd_strpcatnum(buf, (immediate >> (8 << size)) & 0xffff); - *buf++ = ':'; - // immediate is masked below. - break; - } - - nosplitimm: - if (op_type == FD_OT_OFF) - immediate += addr + FD_SIZE(instr); - if (size == 0) - immediate &= 0xff; - else if (size == 1) - immediate &= 0xffff; - else if (size == 2) - immediate &= 0xffffffff; - buf = fd_strpcatnum(buf, immediate); - } - - if (i == 0 && FD_MASKREG(instr)) { - *buf++ = '{'; - buf = fd_strpcatreg(buf, FD_RT_MASK, FD_MASKREG(instr), 0); - *buf++ = '}'; - if (FD_MASKZERO(instr)) - buf = fd_strpcat(buf, fd_stre("{z}")); - } - } - if (UNLIKELY(FD_ROUNDCONTROL(instr) != FD_RC_MXCSR)) { - switch (FD_ROUNDCONTROL(instr)) { - case FD_RC_RN: buf = fd_strpcat(buf, fd_stre(", {rn-sae}")); break; - case FD_RC_RD: buf = fd_strpcat(buf, fd_stre(", {rd-sae}")); break; - case FD_RC_RU: buf = fd_strpcat(buf, fd_stre(", {ru-sae}")); break; - case FD_RC_RZ: buf = fd_strpcat(buf, fd_stre(", {rz-sae}")); break; - case FD_RC_SAE: buf = fd_strpcat(buf, fd_stre(", {sae}")); break; - default: break; // should not happen - } - } - *buf++ = '\0'; - return buf; -} - -void -fd_format(const FdInstr* instr, char* buffer, size_t len) -{ - fd_format_abs(instr, 0, buffer, len); -} - -void -fd_format_abs(const FdInstr* instr, uint64_t addr, char* restrict buffer, size_t len) { - char tmp[128]; - char* buf = buffer; - if (UNLIKELY(len < 128)) { - if (!len) - return; - buf = tmp; - } - - char* end = fd_format_impl(buf, instr, addr); - - if (buf != buffer) { - unsigned i; - for (i = 0; i < (end - tmp) && i < len-1; i++) - buffer[i] = tmp[i]; - buffer[i] = '\0'; - } -} diff --git a/third_party/fadec/instrs.txt b/third_party/fadec/instrs.txt deleted file mode 100644 index 2433c1e..0000000 --- a/third_party/fadec/instrs.txt +++ /dev/null @@ -1,2596 +0,0 @@ -# Fadec Instruction Description Table -# -# This file table contains all supported instructions. The format is custom, -# this parsed and processed into decode tables/encoders in parseinstrs.py. -# -# -# The opcode is used to determine the instruction row when decoding from -# instruction bytes. There are multiple components up to the opcode byte: -# -# (VEX\.|EVEX\.)? -> VEX/EVEX prefix; or legacy if absent -# ((NP|66|F2|F3|NFx)\.)? -> optional mandatory prefix -# (W[01]\.)? -> W0/W1, ignored if absent -# (L(0|1|12|IG)\.)? -> VEX.L/EVEX.L'L constraint, must not occur for legacy -# opcodes; not really used for distinguishing instructions/encodings -# (exceptions: VZEROUPPER/VZEROALL and VMOVDDUP) -# (|0f|0f38|0f3a|M[56]\.) -> legacy escape; or VEX/EVEX opcode map -# [0-9a-f]{2} -> actual opcode byte -# -# After the opcode byte, at most one of the following specifiers can follow: -# -# /[rm] -> ModRM.mod specifier (register or memory operand only) -# /[0-7] -> ModRM.reg specifier (used as opcode extension) -# /[0-7][rm] -> ModRM.mod and ModRM.reg specifier -# /[rm][0-7] -> ModRM.mod and ModRM.r/m specifier (AMX only) -# [c-f][0-9a-f] -> complete ModRM specifier, whole byte used as opcode ext. -# + -> for O-encoded instructions, the last three bits are an operand -# -# A legacy opcode may be prefixed with "*", making it a weak opcode which can be -# overwritten by later opcode definitions. This is used for reserved nops, -# reserved prefetch, BSF/BSR (overwritten by TZCNT/LZCNT), and WBINVD -# (overwritten by WBNOINVD). -# -# The encoding description follows the naming found in older (pre-AVX-512) Intel -# SDMs. It maps encoding fields to operand indices and specifies the immediate -# encoding. The gist is: M=ModRM.r/m; R=ModRM.reg; V=VEX.vvvv; A=EAX/XMM0; C=CL; -# I=imm; O=opcode bits 5:7; S=opcode bits 2:4; FD/TD=absolute address; D=jump -# destination. RVMR is an exception, the register is encoded in imm8[7:4]. -# MOV_CR/MOV_DR are another exception, they ignore ModRM.mod and always encode a -# register operand. -# -# For operands, the first letter specified the operand kind. Naming is mostly -# consistent with Intel's SDM, except for F (Intel: eflags; here: FPU). -# -# GP MMX XMM MSK TMM FPU CR DR SEG -# ModRM.r/m (reg) R N U K T F - - - -# ModRM.r/m (r/m) E Q W K T - - - - -# ModRM.reg G P V K T F C D S -# VEX.vvvv B - H K T - - - - -# imm8[7:4] - - L - - - - - - -# -# M=memory only; O=direct address -# I=immediate; A=address/far jmp; J=rip-relative address/jmp -# -# The remaining one or two letters specify the operand size: -# -# - Fixed sizes: b=1; w=2, d/ss=4; q/sd=8; dq=16; qq=32; oq=64 -# - GP operand sizes: v=2/4/8 (66/REX.W); y=4/8 (66 ignored) -# - Vector sizes: x/ps/pd=16/32/64 (EVEX.L'L); h=half x, f=fourth x; e=eighth x -# - Other immediate sizes: z=v with max. 4 bytes; bs=v (sign-extended byte); -# zd=z (but always four byte imm); zq=z (but always eight byte imm) -# - Special operand size: a=z:z (BOUND only); p=w:z (far pointer) -# - If not letter is specified, the operand size is decoded as zero. The size -# is implicitly part of the operand and can be reconstructed by the user. -# -# The instruction mnemonic is generally specified as decoded/formatted (there -# are a few exceptions, see parseinstrs.py decode_table and encode_mnems). -# -# After the mnemonic, flags can be specified. Some common flags have a short -# form immediately after the mnemonic (e.g., EVX_ADDSD+kr), others do not. -# -# - I64: invalid in 64-bit mode -# - O64: only valid in 64-bit mode -# - +w (INSTR_WIDTH): store operand size as instruction attribute; used for -# instructions that depend on the operand size but have no explicit operands. -# - +a (U67): respects addr-size override even without memory operand. -# - +s (USEG): respects segment override even without memory operand. -# - +k (MASK): supports EVEX masking. -# - +e (SAE): supports EVEX suppress all exceptions. -# - +r (ER): supports EVEX embedded rounding control. -# - +b (BCST): supports EVEX embedded broadcast. Broadcast size depends on REX.W -# (REX.W=0 => 32 bits; REX.W=1 => 64 bits). -# - BCST16: set EVEX embedded broadcast size to 16 bits. -# - SZ8: has effective operand size of 8 bits (encode only). -# - U66: uses 66 prefix as operand size override even with a mandatory prefix. -# - I66: ignores 66 prefix as operand size override. -# - LOCK: supports LOCK prefix when the first operand is memory. -# - D64: defaults to 64-bit operand size in 64-bit mode (REX.W ignored). -# - F64: forced to 64-bit operand size in 64-bit mode (66/REX.W ignored). -# NB: this is Intel-specific. On AMD, F64 behaves like D64. -# - VSIB: memory operand uses VSIB encoding (SIB required, idx is vector). -# - ENC_SEPSZ: attach size suffixes to each operand (encode only). -# - ENC_NOSZ: do not attach size suffix (encode only). -# - ENC_REP: supports REP prefix. -# - ENC_REPCC: supports REPZ/REPNZ prefix. -# - UNDOC: undocumented, ignored by default. -# - TUPLE_*: AVX-512 tuple size. Only used to verify operand sizes. -# - CPL0: only valid if CPL=0 (system mode). Annotation only. -# - F=: feature flags. Annotation only. -# - EFL=: status flags use/modifications. Order: OF/DF/IF/SF/ZF/AF/PF/CF. -# t=test; m=modify; 0=clear; 1=set; M=test-and-modify; u=undefined -# -# -# Opcode ENC OP1 OP2 OP3 OP4 MNEM COND SZ? MISC FLAGS -# LOCK SZ8 -# I64 D64 -# O64 F64 -# VSIB U66 -# I66 -# ------------------- ---- --- --- --- --- ------- ---- --- ---------- -00 MR Eb Gb - - ADD LOCK SZ8 EFL=m--mmmmm -01 MR Ev Gv - - ADD LOCK EFL=m--mmmmm -02 RM Gb Eb - - ADD SZ8 EFL=m--mmmmm -03 RM Gv Ev - - ADD EFL=m--mmmmm -04 IA Rb Ib - - ADD SZ8 EFL=m--mmmmm -05 IA Rv Iz - - ADD EFL=m--mmmmm -06 S Sv - - - PUSH_SEG I64 -07 S Sv - - - POP_SEG I64 -08 MR Eb Gb - - OR LOCK SZ8 EFL=0--mmum0 -09 MR Ev Gv - - OR LOCK EFL=0--mmum0 -0a RM Gb Eb - - OR SZ8 EFL=0--mmum0 -0b RM Gv Ev - - OR EFL=0--mmum0 -0c IA Rb Ib - - OR SZ8 EFL=0--mmum0 -0d IA Rv Iz - - OR EFL=0--mmum0 -0e S Sv - - - PUSH_SEG I64 -#0f escape opcode -10 MR Eb Gb - - ADC LOCK SZ8 EFL=m--mmmmM -11 MR Ev Gv - - ADC LOCK EFL=m--mmmmM -12 RM Gb Eb - - ADC SZ8 EFL=m--mmmmM -13 RM Gv Ev - - ADC EFL=m--mmmmM -14 IA Rb Ib - - ADC SZ8 EFL=m--mmmmM -15 IA Rv Iz - - ADC EFL=m--mmmmM -16 S Sv - - - PUSH_SEG I64 -17 S Sv - - - POP_SEG I64 -18 MR Eb Gb - - SBB LOCK SZ8 EFL=m--mmmmM -19 MR Ev Gv - - SBB LOCK EFL=m--mmmmM -1a RM Gb Eb - - SBB SZ8 EFL=m--mmmmM -1b RM Gv Ev - - SBB EFL=m--mmmmM -1c IA Rb Ib - - SBB SZ8 EFL=m--mmmmM -1d IA Rv Iz - - SBB EFL=m--mmmmM -1e S Sv - - - PUSH_SEG I64 -1f S Sv - - - POP_SEG I64 -20 MR Eb Gb - - AND LOCK SZ8 EFL=0--mmum0 -21 MR Ev Gv - - AND LOCK EFL=0--mmum0 -22 RM Gb Eb - - AND SZ8 EFL=0--mmum0 -23 RM Gv Ev - - AND EFL=0--mmum0 -24 IA Rb Ib - - AND SZ8 EFL=0--mmum0 -25 IA Rv Iz - - AND EFL=0--mmum0 -#26 SEG=ES prefix -27 NP - - - - DAA I64 EFL=u--mmMmM -28 MR Eb Gb - - SUB LOCK SZ8 EFL=m--mmmmm -29 MR Ev Gv - - SUB LOCK EFL=m--mmmmm -2a RM Gb Eb - - SUB SZ8 EFL=m--mmmmm -2b RM Gv Ev - - SUB EFL=m--mmmmm -2c IA Rb Ib - - SUB SZ8 EFL=m--mmmmm -2d IA Rv Iz - - SUB EFL=m--mmmmm -#2e SEG=CS prefix -2f NP - - - - DAS I64 EFL=u--mmMmM -30 MR Eb Gb - - XOR LOCK SZ8 EFL=0--mmum0 -31 MR Ev Gv - - XOR LOCK EFL=0--mmum0 -32 RM Gb Eb - - XOR SZ8 EFL=0--mmum0 -33 RM Gv Ev - - XOR EFL=0--mmum0 -34 IA Rb Ib - - XOR SZ8 EFL=0--mmum0 -35 IA Rv Iz - - XOR EFL=0--mmum0 -#36 SEG=SS prefix -37 NP - - - - AAA I64 EFL=u--uuMum -38 MR Eb Gb - - CMP SZ8 EFL=m--mmmmm -39 MR Ev Gv - - CMP EFL=m--mmmmm -3a RM Gb Eb - - CMP SZ8 EFL=m--mmmmm -3b RM Gv Ev - - CMP EFL=m--mmmmm -3c IA Rb Ib - - CMP SZ8 EFL=m--mmmmm -3d IA Rv Iz - - CMP EFL=m--mmmmm -#3e SEG=DS prefix -3f NP - - - - AAS I64 EFL=u--uuMum -40+ O Rv - - - INC I64 EFL=m--mmmm- -48+ O Rv - - - DEC I64 EFL=m--mmmm- -50+ O Rv - - - PUSH D64 -58+ O Rv - - - POP D64 -60 NP - - - - PUSHA+w I64 -61 NP - - - - POPA+w I64 -62/m RM Gv Ma - - BOUND I64 -63 MR Ew Gw - - ARPL I64 EFL=----m--- -63 RM Gv Ed - - MOVSX O64 F=LM ENC_SEPSZ -#64 SEG=FS prefix -#65 SEG=GS prefix -#66 operand size prefix -#67 address size prefix -68 I Iz - - - PUSH D64 -69 RMI Gv Ev Iz - IMUL EFL=m--uuuum -6a I Ibs - - - PUSH D64 -6b RMI Gv Ev Ibs - IMUL EFL=m--uuuum -6c NP - - - - INS+wa SZ8 ENC_REP EFL=-t------ -6d NP - - - - INS+wa ENC_REP EFL=-t------ -6e NP - - - - OUTS+was SZ8 ENC_REP EFL=-t------ -6f NP - - - - OUTS+was ENC_REP EFL=-t------ -70 D Jbs - - - JO F64 EFL=t------- ENC_CC_BEGIN -71 D Jbs - - - JNO F64 EFL=t------- -72 D Jbs - - - JC F64 EFL=-------t -73 D Jbs - - - JNC F64 EFL=-------t -74 D Jbs - - - JZ F64 EFL=----t--- -75 D Jbs - - - JNZ F64 EFL=----t--- -76 D Jbs - - - JBE F64 EFL=----t--t -77 D Jbs - - - JA F64 EFL=----t--t -78 D Jbs - - - JS F64 EFL=---t---- -79 D Jbs - - - JNS F64 EFL=---t---- -7a D Jbs - - - JP F64 EFL=------t- -7b D Jbs - - - JNP F64 EFL=------t- -7c D Jbs - - - JL F64 EFL=t--t---- -7d D Jbs - - - JGE F64 EFL=t--t---- -7e D Jbs - - - JLE F64 EFL=t--tt--- -7f D Jbs - - - JG F64 EFL=t--tt--- -80/0 MI Eb Ib - - ADD LOCK SZ8 EFL=m--mmmmm -80/1 MI Eb Ib - - OR LOCK SZ8 EFL=0--mmum0 -80/2 MI Eb Ib - - ADC LOCK SZ8 EFL=m--mmmmM -80/3 MI Eb Ib - - SBB LOCK SZ8 EFL=m--mmmmM -80/4 MI Eb Ib - - AND LOCK SZ8 EFL=0--mmum0 -80/5 MI Eb Ib - - SUB LOCK SZ8 EFL=m--mmmmm -80/6 MI Eb Ib - - XOR LOCK SZ8 EFL=0--mmum0 -80/7 MI Eb Ib - - CMP SZ8 EFL=m--mmmmm -81/0 MI Ev Iz - - ADD LOCK EFL=m--mmmmm -81/1 MI Ev Iz - - OR LOCK EFL=0--mmum0 -81/2 MI Ev Iz - - ADC LOCK EFL=m--mmmmM -81/3 MI Ev Iz - - SBB LOCK EFL=m--mmmmM -81/4 MI Ev Iz - - AND LOCK EFL=0--mmum0 -81/5 MI Ev Iz - - SUB LOCK EFL=m--mmmmm -81/6 MI Ev Iz - - XOR LOCK EFL=0--mmum0 -81/7 MI Ev Iz - - CMP EFL=m--mmmmm -82/0 MI Eb Ib - - ADD LOCK I64 SZ8 EFL=m--mmmmm -82/1 MI Eb Ib - - OR LOCK I64 SZ8 EFL=0--mmum0 -82/2 MI Eb Ib - - ADC LOCK I64 SZ8 EFL=m--mmmmM -82/3 MI Eb Ib - - SBB LOCK I64 SZ8 EFL=m--mmmmM -82/4 MI Eb Ib - - AND LOCK I64 SZ8 EFL=0--mmum0 -82/5 MI Eb Ib - - SUB LOCK I64 SZ8 EFL=m--mmmmm -82/6 MI Eb Ib - - XOR LOCK I64 SZ8 EFL=0--mmum0 -82/7 MI Eb Ib - - CMP I64 SZ8 EFL=m--mmmmm -83/0 MI Ev Ibs - - ADD LOCK EFL=m--mmmmm -83/1 MI Ev Ibs - - OR LOCK EFL=0--mmum0 -83/2 MI Ev Ibs - - ADC LOCK EFL=m--mmmmM -83/3 MI Ev Ibs - - SBB LOCK EFL=m--mmmmM -83/4 MI Ev Ibs - - AND LOCK EFL=0--mmum0 -83/5 MI Ev Ibs - - SUB LOCK EFL=m--mmmmm -83/6 MI Ev Ibs - - XOR LOCK EFL=0--mmum0 -83/7 MI Ev Ibs - - CMP EFL=m--mmmmm -84 MR Eb Gb - - TEST SZ8 EFL=0--mmum0 -85 MR Ev Gv - - TEST EFL=0--mmum0 -86 MR Eb Gb - - XCHG LOCK SZ8 -87 MR Ev Gv - - XCHG LOCK -88 MR Eb Gb - - MOV SZ8 -89 MR Ev Gv - - MOV -8a RM Gb Eb - - MOV SZ8 -8b RM Gv Ev - - MOV -# TODO: 8c is actually Ev,Sw; exact semantics are TBD -8c/0 MR Ew Sw - - MOV_S2G -8c/1 MR Ew Sw - - MOV_S2G -8c/2 MR Ew Sw - - MOV_S2G -8c/3 MR Ew Sw - - MOV_S2G -8c/4 MR Ew Sw - - MOV_S2G -8c/5 MR Ew Sw - - MOV_S2G -8d/m RM Gv M - - LEA -8e/0 RM Sw Ew - - MOV_G2S -8e/2 RM Sw Ew - - MOV_G2S -8e/3 RM Sw Ew - - MOV_G2S -8e/4 RM Sw Ew - - MOV_G2S -8e/5 RM Sw Ew - - MOV_G2S -8f/0 M Ev - - - POP D64 -# Against frequent belief, only, XCHG (r/e)AX, (r)AX with 90 is NOP. -# As a lacking REX.B cannot be specified here, this is hardcoded. -90+ OA Rv Rv - - XCHG_NOP -98 NP - - - - C_EX+w -99 NP - - - - C_SEP+w -# Far jmp/call immediate size adjusted in code -9a I Ap - - - CALLF I64 -9b NP - - - - FWAIT -9c NP - - - - PUSHF+w D64 EFL=tttttttt -9d NP - - - - POPF+w D64 EFL=mmmmmmmm -9e NP - - - - SAHF EFL=---mmmmm -9f NP - - - - LAHF EFL=---ttttt -a0 FD Rb Ob - - MOV+as SZ8 -a1 FD Rv Ov - - MOV+as -a2 TD Ob Rb - - MOV+as SZ8 -a3 TD Ov Rv - - MOV+as -a4 NP - - - - MOVS+was SZ8 ENC_REP EFL=-t------ -a5 NP - - - - MOVS+was ENC_REP EFL=-t------ -a6 NP - - - - CMPS+was SZ8 ENC_REPCC EFL=mt-mmmmm -a7 NP - - - - CMPS+was ENC_REPCC EFL=mt-mmmmm -a8 IA Rb Ib - - TEST SZ8 EFL=0--mmum0 -a9 IA Rv Iz - - TEST EFL=0--mmum0 -aa NP - - - - STOS+wa SZ8 ENC_REP EFL=-t------ -ab NP - - - - STOS+wa ENC_REP EFL=-t------ -ac NP - - - - LODS+was SZ8 ENC_REP EFL=-t------ -ad NP - - - - LODS+was ENC_REP EFL=-t------ -ae NP - - - - SCAS+wa SZ8 ENC_REPCC EFL=mt-mmmmm -af NP - - - - SCAS+wa ENC_REPCC EFL=mt-mmmmm -b0+ OI Rb Ib - - MOVABS SZ8 -b8+ OI Rv Iv - - MOVABS -c0/0 MI Eb Ib - - ROL SZ8 EFL=m------m -c0/1 MI Eb Ib - - ROR SZ8 EFL=m------m -c0/2 MI Eb Ib - - RCL SZ8 EFL=m------M -c0/3 MI Eb Ib - - RCR SZ8 EFL=m------M -c0/4 MI Eb Ib - - SHL SZ8 EFL=m--mmumm -c0/5 MI Eb Ib - - SHR SZ8 EFL=m--mmumm -c0/6 MI Eb Ib - - SHL SZ8 EFL=m--mmumm -c0/7 MI Eb Ib - - SAR SZ8 EFL=m--mmumm -c1/0 MI Ev Ib - - ROL EFL=m------m -c1/1 MI Ev Ib - - ROR EFL=m------m -c1/2 MI Ev Ib - - RCL EFL=m------M -c1/3 MI Ev Ib - - RCR EFL=m------M -c1/4 MI Ev Ib - - SHL EFL=m--mmumm -c1/5 MI Ev Ib - - SHR EFL=m--mmumm -c1/6 MI Ev Ib - - SHL EFL=m--mmumm -c1/7 MI Ev Ib - - SAR EFL=m--mmumm -# RET immediate size handled in code -c2 I Iw - - - RET+w F64 -c3 NP - - - - RET+w F64 -c4/m RM Gv Mp - - LES I64 -c5/m RM Gv Mp - - LDS I64 -c6/0 MI Eb Ib - - MOV SZ8 -c6f8 I Ib - - - XABORT F=HLERTM -c7/0 MI Ev Iz - - MOV -c7f8 D Jzd - - - XBEGIN I64 F=HLERTM -c7f8 D Jzq - - - XBEGIN O64 F=HLERTM -# ENTER immediate handled in code, actually it is Iw,Ib -c8 I Id - - - ENTER+w D64 -c9 NP - - - - LEAVE+w D64 -# RETF immediate size handled in code -ca I Iw - - - RETF+w -cb NP - - - - RETF+w -cc NP - - - - INT3 EFL=--M----- -cd I Ib - - - INT EFL=--M----- -ce NP - - - - INTO I64 EFL=t-M----- -cf NP - - - - IRET+w EFL=mmmmmmmm -d0/0 M1 Eb Ib - - ROL SZ8 EFL=m------m -d0/1 M1 Eb Ib - - ROR SZ8 EFL=m------m -d0/2 M1 Eb Ib - - RCL SZ8 EFL=m------M -d0/3 M1 Eb Ib - - RCR SZ8 EFL=m------M -d0/4 M1 Eb Ib - - SHL SZ8 EFL=m--mmumm -d0/5 M1 Eb Ib - - SHR SZ8 EFL=m--mmumm -d0/6 M1 Eb Ib - - SHL SZ8 EFL=m--mmumm -d0/7 M1 Eb Ib - - SAR SZ8 EFL=m--mmumm -d1/0 M1 Ev Ib - - ROL EFL=m------m -d1/1 M1 Ev Ib - - ROR EFL=m------m -d1/2 M1 Ev Ib - - RCL EFL=m------M -d1/3 M1 Ev Ib - - RCR EFL=m------M -d1/4 M1 Ev Ib - - SHL EFL=m--mmumm -d1/5 M1 Ev Ib - - SHR EFL=m--mmumm -d1/6 M1 Ev Ib - - SHL EFL=m--mmumm -d1/7 M1 Ev Ib - - SAR EFL=m--mmumm -d2/0 MC Eb Rb - - ROL SZ8 EFL=m------m -d2/1 MC Eb Rb - - ROR SZ8 EFL=m------m -d2/2 MC Eb Rb - - RCL SZ8 EFL=m------M -d2/3 MC Eb Rb - - RCR SZ8 EFL=m------M -d2/4 MC Eb Rb - - SHL SZ8 EFL=m--mmumm -d2/5 MC Eb Rb - - SHR SZ8 EFL=m--mmumm -d2/6 MC Eb Rb - - SHL SZ8 EFL=m--mmumm -d2/7 MC Eb Rb - - SAR SZ8 EFL=m--mmumm -d3/0 MC Ev Rb - - ROL EFL=m------m -d3/1 MC Ev Rb - - ROR EFL=m------m -d3/2 MC Ev Rb - - RCL EFL=m------M -d3/3 MC Ev Rb - - RCR EFL=m------M -d3/4 MC Ev Rb - - SHL EFL=m--mmumm -d3/5 MC Ev Rb - - SHR EFL=m--mmumm -d3/6 MC Ev Rb - - SHL EFL=m--mmumm -d3/7 MC Ev Rb - - SAR EFL=m--mmumm -d4 I Ib - - - AAM I64 SZ8 EFL=u--mmumu -d5 I Ib - - - AAD I64 SZ8 EFL=u--mmumu -d6 NP - - - - SALC I64 UNDOC -d7 NP - - - - XLATB+as -#d8-df FPU Escape -e0 D Jbs - - - LOOPNZ+a F64 EFL=----t--- -e1 D Jbs - - - LOOPZ+a F64 EFL=----t--- -e2 D Jbs - - - LOOP+a F64 -e3 D Jbs - - - JCXZ+a F64 -e4 IA Rb Ib - - IN SZ8 -e5 IA Rz Ib - - IN -e6 IA Rb Ib - - OUT SZ8 -e7 IA Rz Ib - - OUT -e8 D Jz - - - CALL F64 -e9 D Jz - - - JMP F64 -# Far jmp/call immediate size adjusted in code -ea I Ap - - - JMPF I64 -eb D Jbs - - - JMP F64 -ec NP - - - - IN+w SZ8 -ed NP - - - - IN+w -ee NP - - - - OUT+w SZ8 -ef NP - - - - OUT+w -#f0 prefix -f1 NP - - - - INT1 EFL=--M----- -#f2 REPNZ prefix -#f3 REP/REPZ prefix -f4 NP - - - - HLT CPL0 -f5 NP - - - - CMC EFL=-------M -f6/0 MI Eb Ib - - TEST SZ8 EFL=0--mmum0 -f6/1 MI Eb Ib - - TEST SZ8 EFL=0--mmum0 -f6/2 M Eb - - - NOT LOCK SZ8 -f6/3 M Eb - - - NEG LOCK SZ8 EFL=m--mmmmm -f6/4 M Eb - - - MUL SZ8 EFL=m--uuuum -f6/5 M Eb - - - IMUL SZ8 EFL=m--uuuum -f6/6 M Eb - - - DIV SZ8 EFL=u--uuuuu -f6/7 M Eb - - - IDIV SZ8 EFL=u--uuuuu -f7/0 MI Ev Iz - - TEST EFL=0--mmum0 -f7/1 MI Ev Iz - - TEST EFL=0--mmum0 -f7/2 M Ev - - - NOT LOCK -f7/3 M Ev - - - NEG LOCK EFL=m--mmmmm -f7/4 M Ev - - - MUL EFL=m--uuuum -f7/5 M Ev - - - IMUL EFL=m--uuuum -f7/6 M Ev - - - DIV EFL=u--uuuuu -f7/7 M Ev - - - IDIV EFL=u--uuuuu -f8 NP - - - - CLC EFL=-------0 -f9 NP - - - - STC EFL=-------1 -fa NP - - - - CLI EFL=--0----- -fb NP - - - - STI EFL=--1----- -fc NP - - - - CLD EFL=-0------ -fd NP - - - - STD EFL=-1------ -fe/0 M Eb - - - INC LOCK SZ8 EFL=m--mmmm- -fe/1 M Eb - - - DEC LOCK SZ8 EFL=m--mmmm- -ff/0 M Ev - - - INC LOCK EFL=m--mmmm- -ff/1 M Ev - - - DEC LOCK EFL=m--mmmm- -ff/2 M Ev - - - CALL F64 -ff/3m M Mp - - - CALLF -ff/4 M Ev - - - JMP F64 -ff/5m M Mp - - - JMPF -ff/6 M Ev - - - PUSH D64 -# TODO: SDM states taht SLDT/STR are Rv/Mw (like SMSW), but semantics not verified -0f00/0 M Ew - - - SLDT -0f00/1 M Ew - - - STR -0f00/2 M Ew - - - LLDT CPL0 -0f00/3 M Ew - - - LTR CPL0 -0f00/4 M Ew - - - VERR EFL=----m--- -0f00/5 M Ew - - - VERW EFL=----m--- -0f01/0m M M - - - SGDT -0f01/1m M M - - - SIDT -0f01/2m M M - - - LGDT CPL0 -0f01/3m M M - - - LIDT CPL0 -0f01/4m M Mw - - - SMSW -0f01/4r M Rv - - - SMSW -0f01/6 M Ew - - - LMSW CPL0 -0f01/7m M Mb - - - INVLPG SZ8 F=486 CPL0 -NP.0f01c0 NP - - - - ENCLV F=SGX -NP.0f01c8 NP - - - - MONITOR F=MONITOR -NP.0f01c9 NP - - - - MWAIT F=MONITOR -NP.0f01ca NP - - - - CLAC F=SMAP CPL0 -NP.0f01cb NP - - - - STAC F=SMAP CPL0 -NP.0f01cf NP - - - - ENCLS F=SGX -NP.0f01d0 NP - - - - XGETBV F=XSAVE -NP.0f01d1 NP - - - - XSETBV F=XSAVE -NP.0f01d5 NP - - - - XEND F=HLERTM -NP.0f01d6 NP - - - - XTEST F=HLERTM EFL=0--0m000 -NP.0f01d7 NP - - - - ENCLU F=SGX -0f01f8 NP - - - - SWAPGS O64 F=LM -0f01f9 NP - - - - RDTSCP F=RDTSCP -0f02 RM Gv Ew - - LAR EFL=----m--- -0f03 RM Gv Ew - - LSL EFL=----m--- -0f05 NP - - - - SYSCALL O64 F=LM EFL=MMMMMMMM -0f06 NP - - - - CLTS CPL0 -0f07 NP - - - - SYSRET O64 F=LM CPL0 EFL=mmmmmmmm -0f08 NP - - - - INVD F=486 CPL0 -*0f09 NP - - - - WBINVD F=486 CPL0 -0f0b NP - - - - UD2 -0f0d/0m M Mb - - - PREFETCH F=PREFETCH -0f0d/1m M Mb - - - PREFETCHW F=PREFETCHW -0f0d/2m M Mb - - - PREFETCHWT1 F=PREFETCHWT1 -# All other slots are reserved, AMD maps them to /0 -*0f0d/m M Mb - - - RESERVED_PREFETCH ONLYAMD F=PREFETCH -*0f0d/r MR Rv Gv - - RESERVED_NOP -0f0e NP - - - - FEMMS ONLYAMD F=3DNOW -# TODO: actually decode 3DNow! instructions. Given that 3DNow! no longer exists, -# this is unlikely to happen, though. -0f0f RMI Pq Qq Ib - 3DNOW ONLYAMD F=3DNOW -0f18/0m M Mb - - - PREFETCHNTA F=SSE -0f18/1m M Mb - - - PREFETCHT0 F=SSE -0f18/2m M Mb - - - PREFETCHT1 F=SSE -0f18/3m M Mb - - - PREFETCHT2 F=SSE -0f18/6m M Mb - - - PREFETCHIT1 O64 F=PREFETCHI -0f18/7m M Mb - - - PREFETCHIT0 O64 F=PREFETCHI -# Reserved NOPs are weak, they can be overridden by other instructions. -*0f18 MR Ev Gv - - RESERVED_NOP -*0f19 MR Ev Gv - - RESERVED_NOP -*0f1a MR Ev Gv - - RESERVED_NOP -*0f1b MR Ev Gv - - RESERVED_NOP -*0f1c MR Ev Gv - - RESERVED_NOP -*0f1d MR Ev Gv - - RESERVED_NOP -*0f1e MR Ev Gv - - RESERVED_NOP -*0f1f MR Ev Gv - - RESERVED_NOP -0f1f/0 M Ev - - - NOP -0f20 MR Ry Cy - - MOV_CR2G I66 D64 CPL0 EFL=u--uuuuu -0f21 MR Ry Dy - - MOV_DR2G I66 D64 CPL0 EFL=u--uuuuu -0f22 RM Cy Ry - - MOV_G2CR I66 D64 CPL0 EFL=u--uuuuu -0f23 RM Dy Ry - - MOV_G2DR I66 D64 CPL0 EFL=u--uuuuu -0f30 NP - - - - WRMSR F=586 CPL0 -0f31 NP - - - - RDTSC F=586 -0f32 NP - - - - RDMSR F=586 CPL0 -0f33 NP - - - - RDPMC F=686 -0f34 NP - - - - SYSENTER F=686 EFL=--m----- -0f35 NP - - - - SYSEXIT F=686 CPL0 -NP.0f37 NP - - - - GETSEC F=SMX EFL=MMMMMMMM -# 0f38, 0f3a are escape opcodes -0f40 RM Gv Ev - - CMOVO F=CMOV EFL=t------- ENC_CC_BEGIN -0f41 RM Gv Ev - - CMOVNO F=CMOV EFL=t------- -0f42 RM Gv Ev - - CMOVC F=CMOV EFL=-------t -0f43 RM Gv Ev - - CMOVNC F=CMOV EFL=-------t -0f44 RM Gv Ev - - CMOVZ F=CMOV EFL=----t--- -0f45 RM Gv Ev - - CMOVNZ F=CMOV EFL=----t--- -0f46 RM Gv Ev - - CMOVBE F=CMOV EFL=----t--t -0f47 RM Gv Ev - - CMOVA F=CMOV EFL=----t--t -0f48 RM Gv Ev - - CMOVS F=CMOV EFL=---t---- -0f49 RM Gv Ev - - CMOVNS F=CMOV EFL=---t---- -0f4a RM Gv Ev - - CMOVP F=CMOV EFL=------t- -0f4b RM Gv Ev - - CMOVNP F=CMOV EFL=------t- -0f4c RM Gv Ev - - CMOVL F=CMOV EFL=t--t---- -0f4d RM Gv Ev - - CMOVGE F=CMOV EFL=t--t---- -0f4e RM Gv Ev - - CMOVLE F=CMOV EFL=t--tt--- -0f4f RM Gv Ev - - CMOVG F=CMOV EFL=t--tt--- -0f80 D Jz - - - JO F64 EFL=t------- ENC_CC_BEGIN -0f81 D Jz - - - JNO F64 EFL=t------- -0f82 D Jz - - - JC F64 EFL=-------t -0f83 D Jz - - - JNC F64 EFL=-------t -0f84 D Jz - - - JZ F64 EFL=----t--- -0f85 D Jz - - - JNZ F64 EFL=----t--- -0f86 D Jz - - - JBE F64 EFL=----t--t -0f87 D Jz - - - JA F64 EFL=----t--t -0f88 D Jz - - - JS F64 EFL=---t---- -0f89 D Jz - - - JNS F64 EFL=---t---- -0f8a D Jz - - - JP F64 EFL=------t- -0f8b D Jz - - - JNP F64 EFL=------t- -0f8c D Jz - - - JL F64 EFL=t--t---- -0f8d D Jz - - - JGE F64 EFL=t--t---- -0f8e D Jz - - - JLE F64 EFL=t--tt--- -0f8f D Jz - - - JG F64 EFL=t--tt--- -0f90 M Eb - - - SETO SZ8 EFL=t------- ENC_CC_BEGIN -0f91 M Eb - - - SETNO SZ8 EFL=t------- -0f92 M Eb - - - SETC SZ8 EFL=-------t -0f93 M Eb - - - SETNC SZ8 EFL=-------t -0f94 M Eb - - - SETZ SZ8 EFL=----t--- -0f95 M Eb - - - SETNZ SZ8 EFL=----t--- -0f96 M Eb - - - SETBE SZ8 EFL=----t--t -0f97 M Eb - - - SETA SZ8 EFL=----t--t -0f98 M Eb - - - SETS SZ8 EFL=---t---- -0f99 M Eb - - - SETNS SZ8 EFL=---t---- -0f9a M Eb - - - SETP SZ8 EFL=------t- -0f9b M Eb - - - SETNP SZ8 EFL=------t- -0f9c M Eb - - - SETL SZ8 EFL=t--t---- -0f9d M Eb - - - SETGE SZ8 EFL=t--t---- -0f9e M Eb - - - SETLE SZ8 EFL=t--tt--- -0f9f M Eb - - - SETG SZ8 EFL=t--tt--- -0fa0 S Sv - - - PUSH_SEG D64 -0fa1 S Sv - - - POP_SEG D64 -0fa2 NP - - - - CPUID F=586 -0fa3 MR Ev Gv - - BT EFL=u--u-uum -0fa4 MRI Ev Gv Ib - SHLD EFL=u--mmumm -0fa5 MRC Ev Gv Rb - SHLD EFL=u--mmumm -0fa8 S Sv - - - PUSH_SEG D64 -0fa9 S Sv - - - POP_SEG D64 -0faa NP - - - - RSM F=586 -0fab MR Ev Gv - - BTS LOCK EFL=u--u-uum -0fac MRI Ev Gv Ib - SHRD EFL=u--mmumm -0fad MRC Ev Gv Rb - SHRD EFL=u--mmumm -0faf RM Gv Ev - - IMUL EFL=m--uuuum -0fb0 MR Eb Gb - - CMPXCHG LOCK SZ8 F=486 EFL=m--mmmmm -0fb1 MR Ev Gv - - CMPXCHG LOCK F=486 EFL=m--mmmmm -0fb2/m RM Gv Mp - - LSS -0fb3 MR Ev Gv - - BTR LOCK EFL=u--u-uum -0fb4/m RM Gv Mp - - LFS -0fb5/m RM Gv Mp - - LGS -0fb6 RM Gv Eb - - MOVZX ENC_SEPSZ -0fb7 RM Gv Ew - - MOVZX ENC_SEPSZ -F3.0fb8 RM Gv Ev - - POPCNT U66 F=POPCNT EFL=0--0m000 -0fb9 RM Gv Ev - - UD1 -0fba/4 MI Ev Ib - - BT EFL=u--u-uum -0fba/5 MI Ev Ib - - BTS LOCK EFL=u--u-uum -0fba/6 MI Ev Ib - - BTR LOCK EFL=u--u-uum -0fba/7 MI Ev Ib - - BTC LOCK EFL=u--u-uum -0fbb MR Ev Gv - - BTC LOCK EFL=u--u-uum -*0fbc RM Gv Ev - - BSF EFL=u--umuuu -F3.0fbc RM Gv Ev - - TZCNT U66 F=BMI1 EFL=u--umuum -*0fbd RM Gv Ev - - BSR EFL=u--umuuu -F3.0fbd RM Gv Ev - - LZCNT U66 F=LZCNT EFL=u--umuum -0fbe RM Gv Eb - - MOVSX ENC_SEPSZ -0fbf RM Gv Ew - - MOVSX ENC_SEPSZ -0fc0 MR Eb Gb - - XADD LOCK SZ8 F=486 EFL=m--mmmmm -0fc1 MR Ev Gv - - XADD LOCK F=486 EFL=m--mmmmm -NP.0fc3/m MR My Gy - - MOVNTI F=SSE2 -0fc7/1m M M - - - CMPXCHGD+w LOCK I66 F=586 EFL=----m--- -0fc8+ O Rv - - - BSWAP F=486 -0fff RM Gv Ev - - UD0 -# -NFx.0f38f0/m RM Gv Mv - - MOVBE F=MOVBE -F2.0f38f0 RM Gd Eb - - CRC32 SZ8 F=SSE42 -NFx.0f38f1/m MR Mv Gv - - MOVBE F=MOVBE -F2.0f38f1 RM Gd Ev - - CRC32 U66 F=SSE42 -# -# MMX -NP.0f2a RM Vq Qq - - MMX_CVTPI2PS F=SSE2 -66.0f2a RM Vdq Qq - - MMX_CVTPI2PD F=SSE2 -NP.0f2c RM Pq Wq - - MMX_CVTTPS2PI F=SSE2 -66.0f2c RM Pq Wdq - - MMX_CVTTPD2PI F=SSE2 -NP.0f2d RM Pq Wq - - MMX_CVTPS2PI F=SSE2 -66.0f2d RM Pq Wdq - - MMX_CVTPD2PI F=SSE2 -NP.0f60 RM Pq Qd - - MMX_PUNPCKLBW F=MMX -NP.0f61 RM Pq Qd - - MMX_PUNPCKLWD F=MMX -NP.0f62 RM Pq Qd - - MMX_PUNPCKLDQ F=MMX -NP.0f63 RM Pq Qq - - MMX_PACKSSWB F=MMX -NP.0f64 RM Pq Qq - - MMX_PCMPGTB F=MMX -NP.0f65 RM Pq Qq - - MMX_PCMPGTW F=MMX -NP.0f66 RM Pq Qq - - MMX_PCMPGTD F=MMX -NP.0f67 RM Pq Qq - - MMX_PACKUSWB F=MMX -NP.0f68 RM Pq Qq - - MMX_PUNPCKHBW F=MMX -NP.0f69 RM Pq Qq - - MMX_PUNPCKHWD F=MMX -NP.0f6a RM Pq Qq - - MMX_PUNPCKHDQ F=MMX -NP.0f6b RM Pq Qq - - MMX_PACKSSDW F=MMX -NP.W0.0f6e RM Pq Ey - - MMX_MOVD_G2M F=MMX ENC_NOSZ -NP.W1.0f6e RM Pq Ey - - MMX_MOVQ_G2M F=MMX ENC_NOSZ -NP.0f6f RM Pq Qq - - MMX_MOVQ F=MMX -NP.0f70 RMI Pq Qq Ib - MMX_PSHUFW F=SSE -NP.0f71/2r MI Nq Ib - - MMX_PSRLW F=MMX -NP.0f71/4r MI Nq Ib - - MMX_PSRAW F=MMX -NP.0f71/6r MI Nq Ib - - MMX_PSLLW F=MMX -NP.0f72/2r MI Nq Ib - - MMX_PSRLD F=MMX -NP.0f72/4r MI Nq Ib - - MMX_PSRAD F=MMX -NP.0f72/6r MI Nq Ib - - MMX_PSLLD F=MMX -NP.0f73/2r MI Nq Ib - - MMX_PSRLQ F=MMX -NP.0f73/6r MI Nq Ib - - MMX_PSLLQ F=MMX -NP.0f74 RM Pq Qq - - MMX_PCMPEQB F=MMX -NP.0f75 RM Pq Qq - - MMX_PCMPEQW F=MMX -NP.0f76 RM Pq Qq - - MMX_PCMPEQD F=MMX -NP.0f77 NP - - - - MMX_EMMS F=MMX -NP.W0.0f7e MR Ey Py - - MMX_MOVD_M2G F=MMX ENC_NOSZ -NP.W1.0f7e MR Ey Py - - MMX_MOVQ_M2G F=MMX ENC_NOSZ -NP.0f7f MR Qq Pq - - MMX_MOVQ F=MMX -NP.0fc4 RMI Pq Ew Ib - MMX_PINSRW F=SSE ENC_NOSZ -NP.0fc5/r RMI Gy Nq Ib - MMX_PEXTRW D64 F=SSE -NP.0fd1 RM Pq Qq - - MMX_PSRLW F=MMX -NP.0fd2 RM Pq Qq - - MMX_PSRLD F=MMX -NP.0fd3 RM Pq Qq - - MMX_PSRLQ F=MMX -NP.0fd4 RM Pq Qq - - MMX_PADDQ F=MMX -NP.0fd5 RM Pq Qq - - MMX_PMULLW F=MMX -F2.0fd6/r RM Pq Uq - - MMX_MOVDQ2Q F=SSE -F3.0fd6/r RM Vdq Nq - - MMX_MOVQ2DQ F=SSE -NP.0fd7/r RM Gv Nq - - MMX_PMOVMSKB D64 F=SSE -NP.0fd8 RM Pq Qq - - MMX_PSUBUSB F=MMX -NP.0fd9 RM Pq Qq - - MMX_PSUBUSW F=MMX -NP.0fda RM Pq Qq - - MMX_PMINUB F=SSE -NP.0fdb RM Pq Qq - - MMX_PAND F=MMX -NP.0fdc RM Pq Qq - - MMX_PADDUSB F=MMX -NP.0fdd RM Pq Qq - - MMX_PADDUSW F=MMX -NP.0fde RM Pq Qq - - MMX_PMAXUB F=SSE -NP.0fdf RM Pq Qq - - MMX_PANDN F=MMX -NP.0fe0 RM Pq Qq - - MMX_PAVGB F=SSE -NP.0fe1 RM Pq Qq - - MMX_PSRAW F=MMX -NP.0fe2 RM Pq Qq - - MMX_PSRAD F=MMX -NP.0fe3 RM Pq Qq - - MMX_PAVGW F=SSE -NP.0fe4 RM Pq Qq - - MMX_PMULHUW F=SSE -NP.0fe5 RM Pq Qq - - MMX_PMULHW F=MMX -NP.0fe7/m MR Mq Pq - - MMX_MOVNTQ F=SSE -NP.0fe8 RM Pq Qq - - MMX_PSUBSB F=MMX -NP.0fe9 RM Pq Qq - - MMX_PSUBSW F=MMX -NP.0feb RM Pq Qq - - MMX_POR F=MMX -NP.0fec RM Pq Qq - - MMX_PADDSB F=MMX -NP.0fea RM Pq Qq - - MMX_PMINSW F=SSE -NP.0fee RM Pq Qq - - MMX_PMAXSW F=SSE -NP.0fed RM Pq Qq - - MMX_PADDSW F=MMX -NP.0fef RM Pq Qq - - MMX_PXOR F=MMX -NP.0ff1 RM Pq Qq - - MMX_PSLLW F=MMX -NP.0ff2 RM Pq Qq - - MMX_PSLLD F=MMX -NP.0ff3 RM Pq Qq - - MMX_PSLLQ F=MMX -NP.0ff4 RM Pq Qq - - MMX_PMULUDQ F=MMX -NP.0ff5 RM Pq Qq - - MMX_PMADDWD F=MMX -NP.0ff6 RM Pq Qq - - MMX_PSADBW F=SSE -NP.0ff7/r RM Pq Nq - - MMX_MASKMOVQ+as F=SSE -NP.0ff8 RM Pq Qq - - MMX_PSUBB F=MMX -NP.0ff9 RM Pq Qq - - MMX_PSUBW F=MMX -NP.0ffa RM Pq Qq - - MMX_PSUBD F=MMX -NP.0ffb RM Pq Qq - - MMX_PSUBQ F=MMX -NP.0ffc RM Pq Qq - - MMX_PADDB F=MMX -NP.0ffd RM Pq Qq - - MMX_PADDW F=MMX -NP.0ffe RM Pq Qq - - MMX_PADDD F=MMX -NP.0f3800 RM Pq Qq - - MMX_PSHUFB F=SSSE3 -NP.0f3801 RM Pq Qq - - MMX_PHADDW F=SSSE3 -NP.0f3802 RM Pq Qq - - MMX_PHADDD F=SSSE3 -NP.0f3803 RM Pq Qq - - MMX_PHADDSW F=SSSE3 -NP.0f3804 RM Pq Qq - - MMX_PMADDUBSW F=SSSE3 -NP.0f3805 RM Pq Qq - - MMX_PHSUBW F=SSSE3 -NP.0f3806 RM Pq Qq - - MMX_PHSUBD F=SSSE3 -NP.0f3807 RM Pq Qq - - MMX_PHSUBSW F=SSSE3 -NP.0f3808 RM Pq Qq - - MMX_PSIGNB F=SSSE3 -NP.0f3809 RM Pq Qq - - MMX_PSIGNW F=SSSE3 -NP.0f380a RM Pq Qq - - MMX_PSIGND F=SSSE3 -NP.0f380b RM Pq Qq - - MMX_PMULHRSW F=SSSE3 -NP.0f381c RM Pq Qq - - MMX_PABSB F=SSSE3 -NP.0f381d RM Pq Qq - - MMX_PABSW F=SSSE3 -NP.0f381e RM Pq Qq - - MMX_PABSD F=SSSE3 -NP.0f3a0f RMI Pq Qq Ib - MMX_PALIGNR F=SSSE3 -# -# SSE -NP.0f10 RM Vps Wps - - SSE_MOVUPS F=SSE -66.0f10 RM Vpd Wpd - - SSE_MOVUPD F=SSE2 -# MOVSS/MOVSD reg,mem set the full XMM register -F3.0f10 RM Vx Wss - - SSE_MOVSS F=SSE -F2.0f10 RM Vx Wsd - - SSE_MOVSD F=SSE2 -NP.0f11 MR Wps Vps - - SSE_MOVUPS F=SSE -66.0f11 MR Wpd Vpd - - SSE_MOVUPD F=SSE2 -F3.0f11 MR Wss Vss - - SSE_MOVSS F=SSE -F2.0f11 MR Wsd Vsd - - SSE_MOVSD F=SSE2 -NP.0f12/m RM Vx Mq - - SSE_MOVLPS F=SSE -NP.0f12/r RM Vx Ux - - SSE_MOVHLPS F=SSE -66.0f12/m RM Vx Mq - - SSE_MOVLPD F=SSE2 -F3.0f12 RM Vx Wx - - SSE_MOVSLDUP F=SSE3 -F2.0f12 RM Vx Wq - - SSE_MOVDDUP F=SSE3 -NP.0f13/m MR Mq Vq - - SSE_MOVLPS F=SSE -66.0f13/m MR Mq Vq - - SSE_MOVLPD F=SSE2 -NP.0f14 RM Vps Wps - - SSE_UNPCKLPS F=SSE -66.0f14 RM Vpd Wpd - - SSE_UNPCKLPD F=SSE2 -NP.0f15 RM Vps Wps - - SSE_UNPCKHPS F=SSE -66.0f15 RM Vpd Wpd - - SSE_UNPCKHPD F=SSE2 -NP.0f16/m RM Vx Mq - - SSE_MOVHPS F=SSE -NP.0f16/r RM Vx Uq - - SSE_MOVLHPS F=SSE -66.0f16/m RM Vdq Mq - - SSE_MOVHPD F=SSE2 -F3.0f16 RM Vx Wx - - SSE_MOVSHDUP F=SSE3 -NP.0f17/m MR Mq Vx - - SSE_MOVHPS F=SSE -66.0f17/m MR Mq Vx - - SSE_MOVHPD F=SSE2 -NP.0f28 RM Vps Wps - - SSE_MOVAPS F=SSE -66.0f28 RM Vpd Wpd - - SSE_MOVAPD F=SSE2 -NP.0f29 MR Wps Vps - - SSE_MOVAPS F=SSE -66.0f29 MR Wpd Vpd - - SSE_MOVAPD F=SSE2 -F3.0f2a RM Vss Ey - - SSE_CVTSI2SS F=SSE -F2.0f2a RM Vsd Ey - - SSE_CVTSI2SD F=SSE2 -NP.0f2b/m MR Mps Vps - - SSE_MOVNTPS F=SSE -66.0f2b/m MR Mpd Vpd - - SSE_MOVNTPD F=SSE2 -F3.0f2b/m MR Mss Vss - - SSE_MOVNTSS F=SSE ONLYAMD -F2.0f2b/m MR Msd Vsd - - SSE_MOVNTSD F=SSE2 ONLYAMD -F3.0f2c RM Gy Wss - - SSE_CVTTSS2SI F=SSE -F2.0f2c RM Gy Wsd - - SSE_CVTTSD2SI F=SSE2 -F3.0f2d RM Gy Wss - - SSE_CVTSS2SI F=SSE -F2.0f2d RM Gy Wsd - - SSE_CVTSD2SI F=SSE2 -NP.0f2e RM Vss Wss - - SSE_UCOMISS F=SSE EFL=0--0m0mm -66.0f2e RM Vsd Wsd - - SSE_UCOMISD F=SSE2 EFL=0--0m0mm -NP.0f2f RM Vss Wss - - SSE_COMISS F=SSE EFL=0--0m0mm -66.0f2f RM Vsd Wsd - - SSE_COMISD F=SSE2 EFL=0--0m0mm -NP.0f50/r RM Gy Udq - - SSE_MOVMSKPS D64 F=SSE -66.0f50/r RM Gy Udq - - SSE_MOVMSKPD D64 F=SSE2 -NP.0f51 RM Vps Wps - - SSE_SQRTPS F=SSE -66.0f51 RM Vpd Wpd - - SSE_SQRTPD F=SSE2 -F3.0f51 RM Vss Wss - - SSE_SQRTSS F=SSE -F2.0f51 RM Vsd Wsd - - SSE_SQRTSD F=SSE2 -NP.0f52 RM Vps Wps - - SSE_RSQRTPS F=SSE -F3.0f52 RM Vss Wss - - SSE_RSQRTSS F=SSE -NP.0f53 RM Vps Wps - - SSE_RCPPS F=SSE -F3.0f53 RM Vss Wss - - SSE_RCPSS F=SSE -NP.0f54 RM Vps Wps - - SSE_ANDPS F=SSE -66.0f54 RM Vpd Wpd - - SSE_ANDPD F=SSE2 -NP.0f55 RM Vps Wps - - SSE_ANDNPS F=SSE -66.0f55 RM Vpd Wpd - - SSE_ANDNPD F=SSE2 -NP.0f56 RM Vps Wps - - SSE_ORPS F=SSE -66.0f56 RM Vpd Wpd - - SSE_ORPD F=SSE2 -NP.0f57 RM Vps Wps - - SSE_XORPS F=SSE -66.0f57 RM Vpd Wpd - - SSE_XORPD F=SSE2 -NP.0f58 RM Vps Wps - - SSE_ADDPS F=SSE -66.0f58 RM Vpd Wpd - - SSE_ADDPD F=SSE2 -F3.0f58 RM Vss Wss - - SSE_ADDSS F=SSE -F2.0f58 RM Vsd Wsd - - SSE_ADDSD F=SSE2 -NP.0f59 RM Vps Wps - - SSE_MULPS F=SSE -66.0f59 RM Vpd Wpd - - SSE_MULPD F=SSE2 -F3.0f59 RM Vss Wss - - SSE_MULSS F=SSE -F2.0f59 RM Vsd Wsd - - SSE_MULSD F=SSE2 -NP.0f5a RM Vpd Wq - - SSE_CVTPS2PD F=SSE2 -66.0f5a RM Vps Wpd - - SSE_CVTPD2PS F=SSE2 -F3.0f5a RM Vsd Wss - - SSE_CVTSS2SD F=SSE2 -F2.0f5a RM Vss Wsd - - SSE_CVTSD2SS F=SSE2 -NP.0f5b RM Vps Wdq - - SSE_CVTDQ2PS F=SSE2 -66.0f5b RM Vdq Wps - - SSE_CVTPS2DQ F=SSE2 -F3.0f5b RM Vdq Wps - - SSE_CVTTPS2DQ F=SSE2 -NP.0f5c RM Vps Wps - - SSE_SUBPS F=SSE -66.0f5c RM Vpd Wpd - - SSE_SUBPD F=SSE2 -F3.0f5c RM Vss Wss - - SSE_SUBSS F=SSE -F2.0f5c RM Vsd Wsd - - SSE_SUBSD F=SSE2 -NP.0f5d RM Vps Wps - - SSE_MINPS F=SSE -66.0f5d RM Vpd Wpd - - SSE_MINPD F=SSE2 -F3.0f5d RM Vss Wss - - SSE_MINSS F=SSE -F2.0f5d RM Vsd Wsd - - SSE_MINSD F=SSE2 -NP.0f5e RM Vps Wps - - SSE_DIVPS F=SSE -66.0f5e RM Vpd Wpd - - SSE_DIVPD F=SSE2 -F3.0f5e RM Vss Wss - - SSE_DIVSS F=SSE -F2.0f5e RM Vsd Wsd - - SSE_DIVSD F=SSE2 -NP.0f5f RM Vps Wps - - SSE_MAXPS F=SSE -66.0f5f RM Vpd Wpd - - SSE_MAXPD F=SSE2 -F3.0f5f RM Vss Wss - - SSE_MAXSS F=SSE -F2.0f5f RM Vsd Wsd - - SSE_MAXSD F=SSE2 -66.0f60 RM Vx Wx - - SSE_PUNPCKLBW F=SSE2 -66.0f61 RM Vx Wx - - SSE_PUNPCKLWD F=SSE2 -66.0f62 RM Vx Wx - - SSE_PUNPCKLDQ F=SSE2 -66.0f63 RM Vx Wx - - SSE_PACKSSWB F=SSE2 -66.0f64 RM Vx Wx - - SSE_PCMPGTB F=SSE2 -66.0f65 RM Vx Wx - - SSE_PCMPGTW F=SSE2 -66.0f66 RM Vx Wx - - SSE_PCMPGTD F=SSE2 -66.0f67 RM Vx Wx - - SSE_PACKUSWB F=SSE2 -66.0f68 RM Vx Wx - - SSE_PUNPCKHBW F=SSE2 -66.0f69 RM Vx Wx - - SSE_PUNPCKHWD F=SSE2 -66.0f6a RM Vx Wx - - SSE_PUNPCKHDQ F=SSE2 -66.0f6b RM Vx Wx - - SSE_PACKSSDW F=SSE2 -66.0f6c RM Vx Wx - - SSE_PUNPCKLQDQ F=SSE2 -66.0f6d RM Vx Wx - - SSE_PUNPCKHQDQ F=SSE2 -66.W0.0f6e RM Vx Ed - - SSE_MOVD_G2X F=SSE2 ENC_NOSZ -66.W1.0f6e RM Vx Eq - - SSE_MOVQ_G2X F=SSE2 ENC_NOSZ -66.0f6f RM Vx Wx - - SSE_MOVDQA F=SSE2 -F3.0f6f RM Vx Wx - - SSE_MOVDQU F=SSE2 -66.0f70 RMI Vx Wx Ib - SSE_PSHUFD F=SSE2 -F3.0f70 RMI Vx Wx Ib - SSE_PSHUFHW F=SSE2 -F2.0f70 RMI Vx Wx Ib - SSE_PSHUFLW F=SSE2 -66.0f71/2r MI Ux Ib - - SSE_PSRLW F=SSE2 -66.0f71/4r MI Ux Ib - - SSE_PSRAW F=SSE2 -66.0f71/6r MI Ux Ib - - SSE_PSLLW F=SSE2 -66.0f72/2r MI Ux Ib - - SSE_PSRLD F=SSE2 -66.0f72/4r MI Ux Ib - - SSE_PSRAD F=SSE2 -66.0f72/6r MI Ux Ib - - SSE_PSLLD F=SSE2 -66.0f73/2r MI Ux Ib - - SSE_PSRLQ F=SSE2 -66.0f73/3r MI Ux Ib - - SSE_PSRLDQ F=SSE2 -66.0f73/6r MI Ux Ib - - SSE_PSLLQ F=SSE2 -66.0f73/7r MI Ux Ib - - SSE_PSLLDQ F=SSE2 -66.0f74 RM Vx Wx - - SSE_PCMPEQB F=SSE2 -66.0f75 RM Vx Wx - - SSE_PCMPEQW F=SSE2 -66.0f76 RM Vx Wx - - SSE_PCMPEQD F=SSE2 -# EXTRQ/INSERTQ immediate size handled in code. -66.0f78/0r MI Ux Iw - - SSE_EXTRQ F=SSE4A ONLYAMD -F2.0f78/r RMI Vx Ux Iw - SSE_INSERTQ F=SSE4A ONLYAMD -66.0f79/r RM Vx Ux - - SSE_EXTRQ F=SSE4A ONLYAMD -F2.0f79/r RM Vx Ux - - SSE_INSERTQ F=SSE4A ONLYAMD -66.0f7c RM Vx Wx - - SSE_HADDPD F=SSE3 -F2.0f7c RM Vx Wx - - SSE_HADDPS F=SSE3 -66.0f7d RM Vx Wx - - SSE_HSUBPD F=SSE3 -F2.0f7d RM Vx Wx - - SSE_HSUBPS F=SSE3 -66.W0.0f7e MR Ey Vy - - SSE_MOVD_X2G F=SSE2 ENC_NOSZ -66.W1.0f7e MR Ey Vy - - SSE_MOVQ_X2G F=SSE2 ENC_NOSZ -F3.0f7e RM Vx Wq - - SSE_MOVQ F=SSE2 -66.0f7f MR Wx Vx - - SSE_MOVDQA F=SSE2 -F3.0f7f MR Wx Vx - - SSE_MOVDQU F=SSE2 -NP.0fae/0m M M - - - FXSAVE+w F=FXSR -NP.0fae/1m M M - - - FXRSTOR+w F=FXSR -NP.0fae/2m M Md - - - LDMXCSR F=SSE -NP.0fae/3m M Md - - - STMXCSR F=SSE -NP.0faee8+ NP - - - - LFENCE F=SSE2 -NP.0faef0+ NP - - - - MFENCE F=SSE2 -NP.0faef8+ NP - - - - SFENCE F=SSE -NP.0fc2 RMI Vps Wps Ib - SSE_CMPPS F=SSE -66.0fc2 RMI Vpd Wpd Ib - SSE_CMPPD F=SSE2 -F3.0fc2 RMI Vss Wss Ib - SSE_CMPSS F=SSE -F2.0fc2 RMI Vsd Wsd Ib - SSE_CMPSD F=SSE2 -66.0fc4 RMI Vx Ew Ib - SSE_PINSRW F=SSE2 ENC_NOSZ -66.0fc5/r RMI Gy Udq Ib - SSE_PEXTRW D64 F=SSE2 ENC_NOSZ -NP.0fc6 RMI Vps Wps Ib - SSE_SHUFPS F=SSE -66.0fc6 RMI Vpd Wpd Ib - SSE_SHUFPD F=SSE2 -66.0fd0 RM Vps Wps - - SSE_ADDSUBPD F=SSE3 -F2.0fd0 RM Vpd Wpd - - SSE_ADDSUBPS F=SSE3 -66.0fd1 RM Vx Wx - - SSE_PSRLW F=SSE2 -66.0fd2 RM Vx Wx - - SSE_PSRLD F=SSE2 -66.0fd3 RM Vx Wx - - SSE_PSRLQ F=SSE2 -66.0fd4 RM Vx Wx - - SSE_PADDQ F=SSE2 -66.0fd5 RM Vx Wx - - SSE_PMULLW F=SSE2 -# This is tricky, MOVQ to mem writes 64 bits, MOVQ to reg writes 128 bits -66.0fd6 MR Wq Vq - - SSE_MOVQ F=SSE2 -66.0fd7/r RM Gy Udq - - SSE_PMOVMSKB D64 F=SSE2 -66.0fd8 RM Vx Wx - - SSE_PSUBUSB F=SSE2 -66.0fd9 RM Vx Wx - - SSE_PSUBUSW F=SSE2 -66.0fda RM Vx Wx - - SSE_PMINUB F=SSE2 -66.0fdb RM Vx Wx - - SSE_PAND F=SSE2 -66.0fdc RM Vx Wx - - SSE_PADDUSB F=SSE2 -66.0fdd RM Vx Wx - - SSE_PADDUSW F=SSE2 -66.0fde RM Vx Wx - - SSE_PMAXUB F=SSE2 -66.0fdf RM Vx Wx - - SSE_PANDN F=SSE2 -66.0fe0 RM Vx Wx - - SSE_PAVGB F=SSE2 -66.0fe1 RM Vx Wx - - SSE_PSRAW F=SSE2 -66.0fe2 RM Vx Wx - - SSE_PSRAD F=SSE2 -66.0fe3 RM Vx Wx - - SSE_PAVGW F=SSE2 -66.0fe4 RM Vx Wx - - SSE_PMULHUW F=SSE2 -66.0fe5 RM Vx Wx - - SSE_PMULHW F=SSE2 -66.0fe6 RM Vx Wpd - - SSE_CVTTPD2DQ F=SSE2 -F3.0fe6 RM Vpd Wq - - SSE_CVTDQ2PD F=SSE2 -F2.0fe6 RM Vx Wpd - - SSE_CVTPD2DQ F=SSE2 -66.0fe7/m MR Mx Vx - - SSE_MOVNTDQ F=SSE2 -66.0fe8 RM Vx Wx - - SSE_PSUBSB F=SSE2 -66.0fe9 RM Vx Wx - - SSE_PSUBSW F=SSE2 -66.0feb RM Vx Wx - - SSE_POR F=SSE2 -66.0fec RM Vx Wx - - SSE_PADDSB F=SSE2 -66.0fea RM Vx Wx - - SSE_PMINSW F=SSE2 -66.0fee RM Vx Wx - - SSE_PMAXSW F=SSE2 -66.0fed RM Vx Wx - - SSE_PADDSW F=SSE2 -66.0fef RM Vx Wx - - SSE_PXOR F=SSE2 -F2.0ff0/m RM Vx Mx - - SSE_LDDQU F=SSE3 -66.0ff1 RM Vx Wx - - SSE_PSLLW F=SSE2 -66.0ff2 RM Vx Wx - - SSE_PSLLD F=SSE2 -66.0ff3 RM Vx Wx - - SSE_PSLLQ F=SSE2 -66.0ff4 RM Vx Wx - - SSE_PMULUDQ F=SSE2 -66.0ff5 RM Vx Wx - - SSE_PMADDWD F=SSE2 -66.0ff6 RM Vx Wx - - SSE_PSADBW F=SSE2 -66.0ff7/r RM Vx Ux - - SSE_MASKMOVDQU+as F=SSE2 -66.0ff8 RM Vx Wx - - SSE_PSUBB F=SSE2 -66.0ff9 RM Vx Wx - - SSE_PSUBW F=SSE2 -66.0ffa RM Vx Wx - - SSE_PSUBD F=SSE2 -66.0ffb RM Vx Wx - - SSE_PSUBQ F=SSE2 -66.0ffc RM Vx Wx - - SSE_PADDB F=SSE2 -66.0ffd RM Vx Wx - - SSE_PADDW F=SSE2 -66.0ffe RM Vx Wx - - SSE_PADDD F=SSE2 -# -66.0f3800 RM Vx Wx - - SSE_PSHUFB F=SSSE3 -66.0f3801 RM Vx Wx - - SSE_PHADDW F=SSSE3 -66.0f3802 RM Vx Wx - - SSE_PHADDD F=SSSE3 -66.0f3803 RM Vx Wx - - SSE_PHADDSW F=SSSE3 -66.0f3804 RM Vx Wx - - SSE_PMADDUBSW F=SSSE3 -66.0f3805 RM Vx Wx - - SSE_PHSUBW F=SSSE3 -66.0f3806 RM Vx Wx - - SSE_PHSUBD F=SSSE3 -66.0f3807 RM Vx Wx - - SSE_PHSUBSW F=SSSE3 -66.0f3808 RM Vx Wx - - SSE_PSIGNB F=SSSE3 -66.0f3809 RM Vx Wx - - SSE_PSIGNW F=SSSE3 -66.0f380a RM Vx Wx - - SSE_PSIGND F=SSSE3 -66.0f380b RM Vx Wx - - SSE_PMULHRSW F=SSSE3 -66.0f3810 RM Vdq Wdq - - SSE_PBLENDVB F=SSE41 -66.0f3814 RMA Vdq Wdq Hdq - SSE_BLENDVPS F=SSE41 -66.0f3815 RMA Vdq Wdq Hdq - SSE_BLENDVPD F=SSE41 -66.0f3817 RM Vx Wx - - SSE_PTEST F=SSE41 EFL=0--0m00m -66.0f381c RM Vx Wx - - SSE_PABSB F=SSSE3 -66.0f381d RM Vx Wx - - SSE_PABSW F=SSSE3 -66.0f381e RM Vx Wx - - SSE_PABSD F=SSSE3 -66.0f3820 RM Vx Wh - - SSE_PMOVSXBW F=SSE41 -66.0f3821 RM Vx Wf - - SSE_PMOVSXBD F=SSE41 -66.0f3822 RM Vx We - - SSE_PMOVSXBQ F=SSE41 -66.0f3823 RM Vx Wh - - SSE_PMOVSXWD F=SSE41 -66.0f3824 RM Vx Wf - - SSE_PMOVSXWQ F=SSE41 -66.0f3825 RM Vx Wh - - SSE_PMOVSXDQ F=SSE41 -66.0f3828 RM Vx Wx - - SSE_PMULDQ F=SSE41 -66.0f3829 RM Vx Wx - - SSE_PCMPEQQ F=SSE41 -66.0f382a/m RM Vx Mx - - SSE_MOVNTDQA F=SSE41 -66.0f382b RM Vx Wx - - SSE_PACKUSDW F=SSE41 -66.0f3830 RM Vx Wh - - SSE_PMOVZXBW F=SSE41 -66.0f3831 RM Vx Wf - - SSE_PMOVZXBD F=SSE41 -66.0f3832 RM Vx We - - SSE_PMOVZXBQ F=SSE41 -66.0f3833 RM Vx Wh - - SSE_PMOVZXWD F=SSE41 -66.0f3834 RM Vx Wf - - SSE_PMOVZXWQ F=SSE41 -66.0f3835 RM Vx Wh - - SSE_PMOVZXDQ F=SSE41 -66.0f3837 RM Vx Wx - - SSE_PCMPGTQ F=SSE41 -66.0f3838 RM Vx Wx - - SSE_PMINSB F=SSE41 -66.0f3839 RM Vx Wx - - SSE_PMINSD F=SSE41 -66.0f383a RM Vx Wx - - SSE_PMINUW F=SSE41 -66.0f383b RM Vx Wx - - SSE_PMINUD F=SSE41 -66.0f383c RM Vx Wx - - SSE_PMAXSB F=SSE41 -66.0f383d RM Vx Wx - - SSE_PMAXSD F=SSE41 -66.0f383e RM Vx Wx - - SSE_PMAXUW F=SSE41 -66.0f383f RM Vx Wx - - SSE_PMAXUD F=SSE41 -66.0f3840 RM Vx Wx - - SSE_PMULLD F=SSE41 -66.0f3841 RM Vx Wx - - SSE_PHMINPOSUW F=SSE41 -# TODO: GP operand has address size -66.0f38f8/m RM Gy Moq - - MOVDIR64B D64 F=MOVDIR64B -NP.0f38f9/m MR My Gy - - MOVDIRI F=MOVDIRI -# -66.0f3a08 RMI Vps Wps Ib - SSE_ROUNDPS F=SSE41 -66.0f3a09 RMI Vpd Wpd Ib - SSE_ROUNDPD F=SSE41 -66.0f3a0a RMI Vss Wss Ib - SSE_ROUNDSS F=SSE41 -66.0f3a0b RMI Vsd Wsd Ib - SSE_ROUNDSD F=SSE41 -66.0f3a0c RMI Vps Wps Ib - SSE_BLENDPS F=SSE41 -66.0f3a0d RMI Vpd Wpd Ib - SSE_BLENDPD F=SSE41 -66.0f3a0e RMI Vx Wx Ib - SSE_PBLENDW F=SSE41 -66.0f3a0f RMI Vx Wx Ib - SSE_PALIGNR F=SSSE3 -66.0f3a14/m MRI Mb Vx Ib - SSE_PEXTRB F=SSE41 -66.0f3a14/r MRI Rd Vx Ib - SSE_PEXTRB F=SSE41 ENC_NOSZ -66.0f3a15/m MRI Mw Vx Ib - SSE_PEXTRW F=SSE41 -66.0f3a15/r MRI Rd Vx Ib - SSE_PEXTRW F=SSE41 ENC_NOSZ -66.W0.0f3a16 MRI Ed Vx Ib - SSE_PEXTRD F=SSE41 ENC_NOSZ -66.W1.0f3a16 MRI Eq Vx Ib - SSE_PEXTRQ F=SSE41 ENC_NOSZ -66.0f3a17 MRI Ed Vx Ib - SSE_EXTRACTPS F=SSE41 -66.0f3a20 RMI Vx Eb Ib - SSE_PINSRB F=SSE41 -66.0f3a21 RMI Vps Wss Ib - SSE_INSERTPS F=SSE41 -66.W0.0f3a22 RMI Vx Ed Ib - SSE_PINSRD F=SSE41 ENC_NOSZ -66.W1.0f3a22 RMI Vx Eq Ib - SSE_PINSRQ F=SSE41 ENC_NOSZ -66.0f3a40 RMI Vps Wps Ib - SSE_DPPS F=SSE41 -66.0f3a41 RMI Vpd Wpd Ib - SSE_DPPD F=SSE41 -66.0f3a42 RMI Vx Wx Ib - SSE_MPSADBW F=SSE41 -66.0f3a44 RMI Vdq Wdq Ib - SSE_PCLMULQDQ F=PCLMULQDQ -66.0f3a60 RMI Vdq Wdq Ib - SSE_PCMPESTRM F=SSE42 EFL=m--mm00m -66.0f3a61 RMI Vdq Wdq Ib - SSE_PCMPESTRI F=SSE42 EFL=m--mm00m -66.0f3a62 RMI Vdq Wdq Ib - SSE_PCMPISTRM F=SSE42 EFL=m--mm00m -66.0f3a63 RMI Vdq Wdq Ib - SSE_PCMPISTRI F=SSE42 EFL=m--mm00m -# -66.0f38db RM Vdq Wdq - - AESIMC F=AESNI -66.0f38dc RM Vdq Wdq - - AESENC F=AESNI -66.0f38dd RM Vdq Wdq - - AESENCLAST F=AESNI -66.0f38de RM Vdq Wdq - - AESDEC F=AESNI -66.0f38df RM Vdq Wdq - - AESDECLAST F=AESNI -66.0f3adf RMI Vdq Wdq Ib - AESKEYGENASSIST F=AESNI -VEX.66.L0.0f38db RM Vdq Wdq - - VAESIMC F=AESNI,AVX -# 256-bit encodings require VAES. -VEX.66.0f38dc RVM Vx Hx Wx - VAESENC F=AESNI,AVX -VEX.66.0f38dd RVM Vx Hx Wx - VAESENCLAST F=AESNI,AVX -VEX.66.0f38de RVM Vx Hx Wx - VAESDEC F=AESNI,AVX -VEX.66.0f38df RVM Vx Hx Wx - VAESDECLAST F=AESNI,AVX -VEX.66.L0.0f3adf RMI Vdq Wdq Ib - VAESKEYGENASSIST F=AESNI,AVX -# -# AVX -VEX.NP.0f10 RM Vps Wps - - VMOVUPS F=AVX -VEX.66.0f10 RM Vpd Wpd - - VMOVUPD F=AVX -VEX.F3.LIG.0f10/m RM Vdq Mss - - VMOVSS F=AVX -VEX.F3.LIG.0f10/r RVM Vdq Hdq Uss - VMOVSS F=AVX -VEX.F2.LIG.0f10/m RM Vdq Msd - - VMOVSD F=AVX -VEX.F2.LIG.0f10/r RVM Vdq Hdq Usd - VMOVSD F=AVX -VEX.NP.0f11 MR Wps Vps - - VMOVUPS F=AVX -VEX.66.0f11 MR Wpd Vpd - - VMOVUPD F=AVX -VEX.F3.LIG.0f11/m MR Mss Vss - - VMOVSS F=AVX -VEX.F3.LIG.0f11/r MVR Udq Hdq Vss - VMOVSS F=AVX -VEX.F2.LIG.0f11/m MR Msd Vsd - - VMOVSD F=AVX -VEX.F2.LIG.0f11/r MVR Udq Hdq Vsd - VMOVSD F=AVX -VEX.NP.L0.0f12/m RVM Vdq Hdq Mq - VMOVLPS F=AVX -VEX.NP.L0.0f12/r RVM Vdq Hdq Udq - VMOVHLPS F=AVX -VEX.66.L0.0f12/m RVM Vdq Hdq Mq - VMOVLPD F=AVX -VEX.F2.L0.0f12 RM Vx Wq - - VMOVDDUP F=AVX -VEX.F2.L1.0f12 RM Vx Wx - - VMOVDDUP F=AVX -VEX.F3.0f12 RM Vx Wx - - VMOVSLDUP F=AVX -VEX.NP.L0.0f13/m MR Mq Vq - - VMOVLPS F=AVX -VEX.66.L0.0f13/m MR Mq Vq - - VMOVLPD F=AVX -VEX.NP.0f14 RVM Vx Hx Wx - VUNPCKLPS F=AVX -VEX.66.0f14 RVM Vx Hx Wx - VUNPCKLPD F=AVX -VEX.NP.0f15 RVM Vx Hx Wx - VUNPCKHPS F=AVX -VEX.66.0f15 RVM Vx Hx Wx - VUNPCKHPD F=AVX -VEX.NP.L0.0f16/m RVM Vdq Hq Mq - VMOVHPS F=AVX -VEX.NP.L0.0f16/r RVM Vdq Hq Uq - VMOVLHPS F=AVX -VEX.66.L0.0f16/m RVM Vdq Hq Mq - VMOVHPD F=AVX -VEX.F3.0f16 RM Vx Wx - - VMOVSHDUP F=AVX -VEX.NP.L0.0f17/m MR Mq Vq - - VMOVHPS F=AVX -VEX.66.L0.0f17/m MR Mq Vq - - VMOVHPD F=AVX -VEX.NP.0f28 RM Vps Wps - - VMOVAPS F=AVX -VEX.66.0f28 RM Vpd Wpd - - VMOVAPD F=AVX -VEX.NP.0f29 MR Wps Vps - - VMOVAPS F=AVX -VEX.66.0f29 MR Wpd Vpd - - VMOVAPD F=AVX -VEX.F3.LIG.0f2a RVM Vdq Hdq Ey - VCVTSI2SS F=AVX -VEX.F2.LIG.0f2a RVM Vdq Hdq Ey - VCVTSI2SD F=AVX -VEX.NP.0f2b/m MR Mps Vps - - VMOVNTPS F=AVX -VEX.66.0f2b/m MR Mpd Vpd - - VMOVNTPD F=AVX -VEX.F3.LIG.0f2c RM Gy Wss - - VCVTTSS2SI F=AVX -VEX.F2.LIG.0f2c RM Gy Wsd - - VCVTTSD2SI F=AVX -VEX.F3.LIG.0f2d RM Gy Wss - - VCVTSS2SI F=AVX -VEX.F2.LIG.0f2d RM Gy Wsd - - VCVTSD2SI F=AVX -VEX.NP.LIG.0f2e RM Vss Wss - - VUCOMISS F=AVX EFL=0--0m0mm -VEX.66.LIG.0f2e RM Vsd Wsd - - VUCOMISD F=AVX EFL=0--0m0mm -VEX.NP.LIG.0f2f RM Vss Wss - - VCOMISS F=AVX EFL=0--0m0mm -VEX.66.LIG.0f2f RM Vsd Wsd - - VCOMISD F=AVX EFL=0--0m0mm -VEX.NP.0f50/r RM Gd Ups - - VMOVMSKPS F=AVX -VEX.66.0f50/r RM Gd Upd - - VMOVMSKPD F=AVX -VEX.NP.0f51 RM Vps Wps - - VSQRTPS F=AVX -VEX.66.0f51 RM Vpd Wpd - - VSQRTPD F=AVX -VEX.F3.LIG.0f51 RVM Vdq Hdq Wss - VSQRTSS F=AVX -VEX.F2.LIG.0f51 RVM Vdq Hdq Wsd - VSQRTSD F=AVX -VEX.NP.0f52 RM Vps Wps - - VRSQRTPS F=AVX -VEX.F3.LIG.0f52 RVM Vdq Hdq Wss - VRSQRTSS F=AVX -VEX.NP.0f53 RM Vps Wps - - VRCPPS F=AVX -VEX.F3.LIG.0f53 RVM Vdq Hdq Wss - VRCPSS F=AVX -VEX.NP.0f54 RVM Vps Hps Wps - VANDPS F=AVX -VEX.66.0f54 RVM Vpd Hpd Wpd - VANDPD F=AVX -VEX.NP.0f55 RVM Vps Hps Wps - VANDNPS F=AVX -VEX.66.0f55 RVM Vpd Hpd Wpd - VANDNPD F=AVX -VEX.NP.0f56 RVM Vps Hps Wps - VORPS F=AVX -VEX.66.0f56 RVM Vpd Hpd Wpd - VORPD F=AVX -VEX.NP.0f57 RVM Vps Hps Wps - VXORPS F=AVX -VEX.66.0f57 RVM Vpd Hpd Wpd - VXORPD F=AVX -VEX.NP.0f58 RVM Vps Hps Wps - VADDPS F=AVX -VEX.66.0f58 RVM Vpd Hpd Wpd - VADDPD F=AVX -VEX.F3.LIG.0f58 RVM Vdq Hdq Wss - VADDSS F=AVX -VEX.F2.LIG.0f58 RVM Vdq Hdq Wsd - VADDSD F=AVX -VEX.NP.0f59 RVM Vps Hps Wps - VMULPS F=AVX -VEX.66.0f59 RVM Vpd Hpd Wpd - VMULPD F=AVX -VEX.F3.LIG.0f59 RVM Vdq Hdq Wss - VMULSS F=AVX -VEX.F2.LIG.0f59 RVM Vdq Hdq Wsd - VMULSD F=AVX -VEX.NP.0f5a RM Vpd Wh - - VCVTPS2PD F=AVX -VEX.66.0f5a RM Vh Wpd - - VCVTPD2PS F=AVX -VEX.F3.LIG.0f5a RVM Vdq Hdq Wss - VCVTSS2SD F=AVX -VEX.F2.LIG.0f5a RVM Vdq Hdq Wsd - VCVTSD2SS F=AVX -VEX.NP.0f5b RM Vps Wx - - VCVTDQ2PS F=AVX -VEX.66.0f5b RM Vx Wps - - VCVTPS2DQ F=AVX -VEX.F3.0f5b RM Vx Wps - - VCVTTPS2DQ F=AVX -VEX.NP.0f5c RVM Vps Hps Wps - VSUBPS F=AVX -VEX.66.0f5c RVM Vpd Hpd Wpd - VSUBPD F=AVX -VEX.F3.LIG.0f5c RVM Vdq Hdq Wss - VSUBSS F=AVX -VEX.F2.LIG.0f5c RVM Vdq Hdq Wsd - VSUBSD F=AVX -VEX.NP.0f5d RVM Vps Hps Wps - VMINPS F=AVX -VEX.66.0f5d RVM Vpd Hpd Wpd - VMINPD F=AVX -VEX.F3.LIG.0f5d RVM Vdq Hdq Wss - VMINSS F=AVX -VEX.F2.LIG.0f5d RVM Vdq Hdq Wsd - VMINSD F=AVX -VEX.NP.0f5e RVM Vps Hps Wps - VDIVPS F=AVX -VEX.66.0f5e RVM Vpd Hpd Wpd - VDIVPD F=AVX -VEX.F3.LIG.0f5e RVM Vdq Hdq Wss - VDIVSS F=AVX -VEX.F2.LIG.0f5e RVM Vdq Hdq Wsd - VDIVSD F=AVX -VEX.NP.0f5f RVM Vps Hps Wps - VMAXPS F=AVX -VEX.66.0f5f RVM Vpd Hpd Wpd - VMAXPD F=AVX -VEX.F3.LIG.0f5f RVM Vdq Hdq Wss - VMAXSS F=AVX -VEX.F2.LIG.0f5f RVM Vdq Hdq Wsd - VMAXSD F=AVX -VEX.66.0f60 RVM Vx Hx Wx - VPUNPCKLBW F=AVX -VEX.66.0f61 RVM Vx Hx Wx - VPUNPCKLWD F=AVX -VEX.66.0f62 RVM Vx Hx Wx - VPUNPCKLDQ F=AVX -VEX.66.0f63 RVM Vx Hx Wx - VPACKSSWB F=AVX -VEX.66.0f64 RVM Vx Hx Wx - VPCMPGTB F=AVX -VEX.66.0f65 RVM Vx Hx Wx - VPCMPGTW F=AVX -VEX.66.0f66 RVM Vx Hx Wx - VPCMPGTD F=AVX -VEX.66.0f67 RVM Vx Hx Wx - VPACKUSWB F=AVX -VEX.66.0f68 RVM Vx Hx Wx - VPUNPCKHBW F=AVX -VEX.66.0f69 RVM Vx Hx Wx - VPUNPCKHWD F=AVX -VEX.66.0f6a RVM Vx Hx Wx - VPUNPCKHDQ F=AVX -VEX.66.0f6b RVM Vx Hx Wx - VPACKSSDW F=AVX -VEX.66.0f6c RVM Vx Hx Wx - VPUNPCKLQDQ F=AVX -VEX.66.0f6d RVM Vx Hx Wx - VPUNPCKHQDQ F=AVX -VEX.66.W0.L0.0f6e RM Vy Ey - - VMOVD_G2X F=AVX ENC_NOSZ -VEX.66.W1.L0.0f6e RM Vy Ey - - VMOVD_G2X I64 F=AVX ENC_NOSZ -VEX.66.W1.L0.0f6e RM Vy Ey - - VMOVQ_G2X O64 F=AVX ENC_NOSZ -VEX.66.0f6f RM Vx Wx - - VMOVDQA F=AVX -VEX.F3.0f6f RM Vx Wx - - VMOVDQU F=AVX -VEX.66.0f70 RMI Vx Wx Ib - VPSHUFD F=AVX -VEX.F3.0f70 RMI Vx Wx Ib - VPSHUFHW F=AVX -VEX.F2.0f70 RMI Vx Wx Ib - VPSHUFLW F=AVX -VEX.66.0f71/2r VMI Hx Ux Ib - VPSRLW F=AVX -VEX.66.0f71/4r VMI Hx Ux Ib - VPSRAW F=AVX -VEX.66.0f71/6r VMI Hx Ux Ib - VPSLLW F=AVX -VEX.66.0f72/2r VMI Hx Ux Ib - VPSRLD F=AVX -VEX.66.0f72/4r VMI Hx Ux Ib - VPSRAD F=AVX -VEX.66.0f72/6r VMI Hx Ux Ib - VPSLLD F=AVX -VEX.66.0f73/2r VMI Hx Ux Ib - VPSRLQ F=AVX -VEX.66.0f73/3r VMI Hx Ux Ib - VPSRLDQ F=AVX -VEX.66.0f73/6r VMI Hx Ux Ib - VPSLLQ F=AVX -VEX.66.0f73/7r VMI Hx Ux Ib - VPSLLDQ F=AVX -VEX.66.0f74 RVM Vx Hx Wx - VPCMPEQB F=AVX -VEX.66.0f75 RVM Vx Hx Wx - VPCMPEQW F=AVX -VEX.66.0f76 RVM Vx Hx Wx - VPCMPEQD F=AVX -VEX.NP.L0.0f77 NP - - - - VZEROUPPER F=AVX -VEX.NP.L1.0f77 NP - - - - VZEROALL F=AVX -VEX.66.0f7c RVM Vx Hx Wx - VHADDPD F=AVX -VEX.F2.0f7c RVM Vx Hx Wx - VHADDPS F=AVX -VEX.66.0f7d RVM Vx Hx Wx - VHSUBPD F=AVX -VEX.F2.0f7d RVM Vx Hx Wx - VHSUBPS F=AVX -VEX.66.W0.L0.0f7e MR Ey Vy - - VMOVD_X2G F=AVX ENC_NOSZ -VEX.66.W1.L0.0f7e MR Ey Vy - - VMOVD_X2G I64 F=AVX ENC_NOSZ -VEX.66.W1.L0.0f7e MR Ey Vy - - VMOVQ_X2G O64 F=AVX ENC_NOSZ -VEX.F3.L0.0f7e RM Vq Wq - - VMOVQ F=AVX -VEX.66.0f7f MR Wx Vx - - VMOVDQA F=AVX -VEX.F3.0f7f MR Wx Vx - - VMOVDQU F=AVX -VEX.NP.L0.0fae/2m M Md - - - VLDMXCSR F=AVX -VEX.NP.L0.0fae/3m M Md - - - VSTMXCSR F=AVX -VEX.NP.0fc2 RVMI Vx Hx Wx Ib VCMPPS F=AVX -VEX.66.0fc2 RVMI Vx Hx Wx Ib VCMPPD F=AVX -VEX.F3.LIG.0fc2 RVMI Vdq Hdq Wss Ib VCMPSS F=AVX -VEX.F2.LIG.0fc2 RVMI Vdq Hdq Wsd Ib VCMPSD F=AVX -VEX.66.L0.0fc4 RVMI Vdq Hdq Ew Ib VPINSRW F=AVX -VEX.66.L0.0fc5/r RMI Gd Udq Ib - VPEXTRW F=AVX -VEX.NP.0fc6 RVMI Vx Hx Wx Ib VSHUFPS F=AVX -VEX.66.0fc6 RVMI Vx Hx Wx Ib VSHUFPD F=AVX -VEX.66.0fd0 RVM Vx Hx Wx - VADDSUBPD F=AVX -VEX.F2.0fd0 RVM Vx Hx Wx - VADDSUBPS F=AVX -VEX.66.0fd1 RVM Vx Hx Wdq - VPSRLW F=AVX -VEX.66.0fd2 RVM Vx Hx Wdq - VPSRLD F=AVX -VEX.66.0fd3 RVM Vx Hx Wdq - VPSRLQ F=AVX -VEX.66.0fd4 RVM Vx Hx Wx - VPADDQ F=AVX -VEX.66.0fd5 RVM Vx Hx Wx - VPMULLW F=AVX -VEX.66.L0.0fd6 MR Wq Vq - - VMOVQ F=AVX -VEX.66.0fd7/r RM Gd Ux - - VPMOVMSKB F=AVX -VEX.66.0fd8 RVM Vx Hx Wx - VPSUBUSB F=AVX -VEX.66.0fd9 RVM Vx Hx Wx - VPSUBUSW F=AVX -VEX.66.0fda RVM Vx Hx Wx - VPMINUB F=AVX -VEX.66.0fdb RVM Vx Hx Wx - VPAND F=AVX -VEX.66.0fdc RVM Vx Hx Wx - VPADDUSB F=AVX -VEX.66.0fdd RVM Vx Hx Wx - VPADDUSW F=AVX -VEX.66.0fde RVM Vx Hx Wx - VPMAXUB F=AVX -VEX.66.0fdf RVM Vx Hx Wx - VPANDN F=AVX -VEX.66.0fe0 RVM Vx Hx Wx - VPAVGB F=AVX -VEX.66.0fe1 RVM Vx Hx Wdq - VPSRAW F=AVX -VEX.66.0fe2 RVM Vx Hx Wdq - VPSRAD F=AVX -VEX.66.0fe3 RVM Vx Hx Wx - VPAVGW F=AVX -VEX.66.0fe4 RVM Vx Hx Wx - VPMULHUW F=AVX -VEX.66.0fe5 RVM Vx Hx Wx - VPMULHW F=AVX -VEX.66.0fe6 RM Vh Wx - - VCVTTPD2DQ F=AVX -VEX.F3.0fe6 RM Vx Wh - - VCVTDQ2PD F=AVX -VEX.F2.0fe6 RM Vh Wx - - VCVTPD2DQ F=AVX -VEX.66.0fe7/m MR Mx Vx - - VMOVNTDQ F=AVX -VEX.66.0fe8 RVM Vx Hx Wx - VPSUBSB F=AVX -VEX.66.0fe9 RVM Vx Hx Wx - VPSUBSW F=AVX -VEX.66.0feb RVM Vx Hx Wx - VPOR F=AVX -VEX.66.0fec RVM Vx Hx Wx - VPADDSB F=AVX -VEX.66.0fea RVM Vx Hx Wx - VPMINSW F=AVX -VEX.66.0fed RVM Vx Hx Wx - VPADDSW F=AVX -VEX.66.0fee RVM Vx Hx Wx - VPMAXSW F=AVX -VEX.66.0fef RVM Vx Hx Wx - VPXOR F=AVX -VEX.F2.0ff0/m RM Vx Mx - - VLDDQU F=AVX -VEX.66.0ff1 RVM Vx Hx Wdq - VPSLLW F=AVX -VEX.66.0ff2 RVM Vx Hx Wdq - VPSLLD F=AVX -VEX.66.0ff3 RVM Vx Hx Wdq - VPSLLQ F=AVX -VEX.66.0ff4 RVM Vx Hx Wx - VPMULUDQ F=AVX -VEX.66.0ff5 RVM Vx Hx Wx - VPMADDWD F=AVX -VEX.66.0ff6 RVM Vx Hx Wx - VPSADBW F=AVX -VEX.66.L0.0ff7/r RM Vx Ux - - VMASKMOVDQU+as F=AVX -VEX.66.0ff8 RVM Vx Hx Wx - VPSUBB F=AVX -VEX.66.0ff9 RVM Vx Hx Wx - VPSUBW F=AVX -VEX.66.0ffa RVM Vx Hx Wx - VPSUBD F=AVX -VEX.66.0ffb RVM Vx Hx Wx - VPSUBQ F=AVX -VEX.66.0ffc RVM Vx Hx Wx - VPADDB F=AVX -VEX.66.0ffd RVM Vx Hx Wx - VPADDW F=AVX -VEX.66.0ffe RVM Vx Hx Wx - VPADDD F=AVX -VEX.66.0f3800 RVM Vx Hx Wx - VPSHUFB F=AVX -VEX.66.0f3801 RVM Vx Hx Wx - VPHADDW F=AVX -VEX.66.0f3802 RVM Vx Hx Wx - VPHADDD F=AVX -VEX.66.0f3803 RVM Vx Hx Wx - VPHADDSW F=AVX -VEX.66.0f3804 RVM Vx Hx Wx - VPMADDUBSW F=AVX -VEX.66.0f3805 RVM Vx Hx Wx - VPHSUBW F=AVX -VEX.66.0f3806 RVM Vx Hx Wx - VPHSUBD F=AVX -VEX.66.0f3807 RVM Vx Hx Wx - VPHSUBSW F=AVX -VEX.66.0f3808 RVM Vx Hx Wx - VPSIGNB F=AVX -VEX.66.0f3809 RVM Vx Hx Wx - VPSIGNW F=AVX -VEX.66.0f380a RVM Vx Hx Wx - VPSIGND F=AVX -VEX.66.0f380b RVM Vx Hx Wx - VPMULHRSW F=AVX -VEX.66.W0.0f380c RVM Vx Hx Wx - VPERMILPS F=AVX -VEX.66.W0.0f380d RVM Vx Hx Wx - VPERMILPD F=AVX -VEX.66.W0.0f380e RM Vx Wx - - VTESTPS F=AVX -VEX.66.W0.0f380f RM Vx Wx - - VTESTPD F=AVX -VEX.66.W0.0f3813 RM Vx Wh - - VCVTPH2PS F=F16C -VEX.66.W0.L1.0f3816 RVM Vx Hx Wx - VPERMPS F=AVX2 -VEX.66.0f3817 RM Vx Wx - - VPTEST F=AVX EFL=0--0m00m -VEX.66.W0.0f3818 RM Vx Wd - - VBROADCASTSS F=AVX -VEX.66.W0.L1.0f3819 RM Vx Wq - - VBROADCASTSD F=AVX -VEX.66.W0.L1.0f381a RM Vx Wdq - - VBROADCASTF128 F=AVX -VEX.66.0f381c RM Vx Wx - - VPABSB F=AVX -VEX.66.0f381d RM Vx Wx - - VPABSW F=AVX -VEX.66.0f381e RM Vx Wx - - VPABSD F=AVX -VEX.66.0f3820 RM Vx Wh - - VPMOVSXBW F=AVX -VEX.66.0f3821 RM Vx Wf - - VPMOVSXBD F=AVX -VEX.66.0f3822 RM Vx We - - VPMOVSXBQ F=AVX -VEX.66.0f3823 RM Vx Wh - - VPMOVSXWD F=AVX -VEX.66.0f3824 RM Vx Wf - - VPMOVSXWQ F=AVX -VEX.66.0f3825 RM Vx Wh - - VPMOVSXDQ F=AVX -VEX.66.0f3828 RVM Vx Hx Wx - VPMULDQ F=AVX -VEX.66.0f3829 RVM Vx Hx Wx - VPCMPEQQ F=AVX -VEX.66.0f382a/m RM Vx Mx - - VMOVNTDQA F=AVX -VEX.66.0f382b RVM Vx Hx Wx - VPACKUSDW F=AVX -VEX.66.W0.0f382c/m RVM Vx Hx Mx - VMASKMOVPS F=AVX -VEX.66.W0.0f382d/m RVM Vx Hx Mx - VMASKMOVPD F=AVX -VEX.66.W0.0f382e/m MVR Mx Hx Vx - VMASKMOVPS F=AVX -VEX.66.W0.0f382f/m MVR Mx Hx Vx - VMASKMOVPD F=AVX -VEX.66.0f3830 RM Vx Wh - - VPMOVZXBW F=AVX -VEX.66.0f3831 RM Vx Wf - - VPMOVZXBD F=AVX -VEX.66.0f3832 RM Vx We - - VPMOVZXBQ F=AVX -VEX.66.0f3833 RM Vx Wh - - VPMOVZXWD F=AVX -VEX.66.0f3834 RM Vx Wf - - VPMOVZXWQ F=AVX -VEX.66.0f3835 RM Vx Wh - - VPMOVZXDQ F=AVX -VEX.66.W0.L1.0f3836 RVM Vx Hx Wx - VPERMD F=AVX2 -VEX.66.0f3837 RVM Vx Hx Wx - VPCMPGTQ F=AVX -VEX.66.0f3838 RVM Vx Hx Wx - VPMINSB F=AVX -VEX.66.0f3839 RVM Vx Hx Wx - VPMINSD F=AVX -VEX.66.0f383a RVM Vx Hx Wx - VPMINUW F=AVX -VEX.66.0f383b RVM Vx Hx Wx - VPMINUD F=AVX -VEX.66.0f383c RVM Vx Hx Wx - VPMAXSB F=AVX -VEX.66.0f383d RVM Vx Hx Wx - VPMAXSD F=AVX -VEX.66.0f383e RVM Vx Hx Wx - VPMAXUW F=AVX -VEX.66.0f383f RVM Vx Hx Wx - VPMAXUD F=AVX -VEX.66.0f3840 RVM Vx Hx Wx - VPMULLD F=AVX -VEX.66.L0.0f3841 RM Vx Wx - - VPHMINPOSUW F=AVX -VEX.66.W0.0f3845 RVM Vx Hx Wx - VPSRLVD F=AVX2 -VEX.66.W1.0f3845 RVM Vx Hx Wx - VPSRLVQ F=AVX2 -VEX.66.W0.0f3846 RVM Vx Hx Wx - VPSRAVD F=AVX2 -VEX.66.W0.0f3847 RVM Vx Hx Wx - VPSLLVD F=AVX2 -VEX.66.W1.0f3847 RVM Vx Hx Wx - VPSLLVQ F=AVX2 -VEX.66.W0.0f3858 RM Vx Wd - - VPBROADCASTD F=AVX2 -VEX.66.W0.0f3859 RM Vx Wq - - VPBROADCASTQ F=AVX2 -VEX.66.W0.L1.0f385a/m RM Vx Mdq - - VBROADCASTI128 F=AVX2 ENC_NOSZ -VEX.66.W0.0f3878 RM Vx Wb - - VPBROADCASTB F=AVX2 -VEX.66.W0.0f3879 RM Vx Ww - - VPBROADCASTW F=AVX2 -VEX.66.W0.0f388c/m RVM Vx Hx Mx - VPMASKMOVD F=AVX2 -VEX.66.W1.0f388c/m RVM Vx Hx Mx - VPMASKMOVQ F=AVX2 -VEX.66.W0.0f388e/m MVR Mx Hx Vx - VPMASKMOVD F=AVX2 -VEX.66.W1.0f388e/m MVR Mx Hx Vx - VPMASKMOVQ F=AVX2 -VEX.66.W0.0f3890/m RMV Vx Md Hx - VPGATHERDD VSIB F=AVX2 -VEX.66.W1.0f3890/m RMV Vx Mq Hx - VPGATHERDQ VSIB F=AVX2 -VEX.66.W0.0f3891/m RMV Vh Md Hh - VPGATHERQD VSIB F=AVX2 -VEX.66.W1.0f3891/m RMV Vx Mq Hx - VPGATHERQQ VSIB F=AVX2 -VEX.66.W0.0f3892/m RMV Vx Md Hx - VGATHERDPS VSIB F=AVX2 -VEX.66.W1.0f3892/m RMV Vx Mq Hx - VGATHERDPD VSIB F=AVX2 -VEX.66.W0.0f3893/m RMV Vh Md Hh - VGATHERQPS VSIB F=AVX2 -VEX.66.W1.0f3893/m RMV Vx Mq Hx - VGATHERQPD VSIB F=AVX2 -VEX.66.W0.0f3896 RVM Vx Hx Wx - VFMADDSUB132PS F=FMA -VEX.66.W1.0f3896 RVM Vx Hx Wx - VFMADDSUB132PD F=FMA -VEX.66.W0.0f3897 RVM Vx Hx Wx - VFMSUBADD132PS F=FMA -VEX.66.W1.0f3897 RVM Vx Hx Wx - VFMSUBADD132PD F=FMA -VEX.66.W0.0f3898 RVM Vx Hx Wx - VFMADD132PS F=FMA -VEX.66.W1.0f3898 RVM Vx Hx Wx - VFMADD132PD F=FMA -VEX.66.W0.LIG.0f3899 RVM Vdq Hdq Wss - VFMADD132SS F=FMA -VEX.66.W1.LIG.0f3899 RVM Vdq Hdq Wsd - VFMADD132SD F=FMA -VEX.66.W0.0f389a RVM Vx Hx Wx - VFMSUB132PS F=FMA -VEX.66.W1.0f389a RVM Vx Hx Wx - VFMSUB132PD F=FMA -VEX.66.W0.LIG.0f389b RVM Vdq Hdq Wss - VFMSUB132SS F=FMA -VEX.66.W1.LIG.0f389b RVM Vdq Hdq Wsd - VFMSUB132SD F=FMA -VEX.66.W0.0f389c RVM Vx Hx Wx - VFNMADD132PS F=FMA -VEX.66.W1.0f389c RVM Vx Hx Wx - VFNMADD132PD F=FMA -VEX.66.W0.LIG.0f389d RVM Vdq Hdq Wss - VFNMADD132SS F=FMA -VEX.66.W1.LIG.0f389d RVM Vdq Hdq Wsd - VFNMADD132SD F=FMA -VEX.66.W0.0f389e RVM Vx Hx Wx - VFNMSUB132PS F=FMA -VEX.66.W1.0f389e RVM Vx Hx Wx - VFNMSUB132PD F=FMA -VEX.66.W0.LIG.0f389f RVM Vdq Hdq Wss - VFNMSUB132SS F=FMA -VEX.66.W1.LIG.0f389f RVM Vdq Hdq Wsd - VFNMSUB132SD F=FMA -VEX.66.W0.0f38a6 RVM Vx Hx Wx - VFMADDSUB213PS F=FMA -VEX.66.W1.0f38a6 RVM Vx Hx Wx - VFMADDSUB213PD F=FMA -VEX.66.W0.0f38a7 RVM Vx Hx Wx - VFMSUBADD213PS F=FMA -VEX.66.W1.0f38a7 RVM Vx Hx Wx - VFMSUBADD213PD F=FMA -VEX.66.W0.0f38a8 RVM Vx Hx Wx - VFMADD213PS F=FMA -VEX.66.W1.0f38a8 RVM Vx Hx Wx - VFMADD213PD F=FMA -VEX.66.W0.LIG.0f38a9 RVM Vdq Hdq Wss - VFMADD213SS F=FMA -VEX.66.W1.LIG.0f38a9 RVM Vdq Hdq Wsd - VFMADD213SD F=FMA -VEX.66.W0.0f38aa RVM Vx Hx Wx - VFMSUB213PS F=FMA -VEX.66.W1.0f38aa RVM Vx Hx Wx - VFMSUB213PD F=FMA -VEX.66.W0.LIG.0f38ab RVM Vdq Hdq Wss - VFMSUB213SS F=FMA -VEX.66.W1.LIG.0f38ab RVM Vdq Hdq Wsd - VFMSUB213SD F=FMA -VEX.66.W0.0f38ac RVM Vx Hx Wx - VFNMADD213PS F=FMA -VEX.66.W1.0f38ac RVM Vx Hx Wx - VFNMADD213PD F=FMA -VEX.66.W0.LIG.0f38ad RVM Vdq Hdq Wss - VFNMADD213SS F=FMA -VEX.66.W1.LIG.0f38ad RVM Vdq Hdq Wsd - VFNMADD213SD F=FMA -VEX.66.W0.0f38ae RVM Vx Hx Wx - VFNMSUB213PS F=FMA -VEX.66.W1.0f38ae RVM Vx Hx Wx - VFNMSUB213PD F=FMA -VEX.66.W0.LIG.0f38af RVM Vdq Hdq Wss - VFNMSUB213SS F=FMA -VEX.66.W1.LIG.0f38af RVM Vdq Hdq Wsd - VFNMSUB213SD F=FMA -VEX.66.W0.0f38b6 RVM Vx Hx Wx - VFMADDSUB231PS F=FMA -VEX.66.W1.0f38b6 RVM Vx Hx Wx - VFMADDSUB231PD F=FMA -VEX.66.W0.0f38b7 RVM Vx Hx Wx - VFMSUBADD231PS F=FMA -VEX.66.W1.0f38b7 RVM Vx Hx Wx - VFMSUBADD231PD F=FMA -VEX.66.W0.0f38b8 RVM Vx Hx Wx - VFMADD231PS F=FMA -VEX.66.W1.0f38b8 RVM Vx Hx Wx - VFMADD231PD F=FMA -VEX.66.W0.LIG.0f38b9 RVM Vdq Hdq Wss - VFMADD231SS F=FMA -VEX.66.W1.LIG.0f38b9 RVM Vdq Hdq Wsd - VFMADD231SD F=FMA -VEX.66.W0.0f38ba RVM Vx Hx Wx - VFMSUB231PS F=FMA -VEX.66.W1.0f38ba RVM Vx Hx Wx - VFMSUB231PD F=FMA -VEX.66.W0.LIG.0f38bb RVM Vdq Hdq Wss - VFMSUB231SS F=FMA -VEX.66.W1.LIG.0f38bb RVM Vdq Hdq Wsd - VFMSUB231SD F=FMA -VEX.66.W0.0f38bc RVM Vx Hx Wx - VFNMADD231PS F=FMA -VEX.66.W1.0f38bc RVM Vx Hx Wx - VFNMADD231PD F=FMA -VEX.66.W0.LIG.0f38bd RVM Vdq Hdq Wss - VFNMADD231SS F=FMA -VEX.66.W1.LIG.0f38bd RVM Vdq Hdq Wsd - VFNMADD231SD F=FMA -VEX.66.W0.0f38be RVM Vx Hx Wx - VFNMSUB231PS F=FMA -VEX.66.W1.0f38be RVM Vx Hx Wx - VFNMSUB231PD F=FMA -VEX.66.W0.LIG.0f38bf RVM Vdq Hdq Wss - VFNMSUB231SS F=FMA -VEX.66.W1.LIG.0f38bf RVM Vdq Hdq Wsd - VFNMSUB231SD F=FMA -VEX.66.W1.L1.0f3a00 RMI Vx Wx Ib - VPERMQ F=AVX2 -VEX.66.W1.L1.0f3a01 RMI Vx Wx Ib - VPERMPD F=AVX2 -VEX.66.W0.0f3a02 RVMI Vx Hx Wx Ib VPBLENDD F=AVX2 -VEX.66.W0.0f3a04 RMI Vx Wx Ib - VPERMILPS F=AVX -VEX.66.W0.0f3a05 RMI Vx Wx Ib - VPERMILPD F=AVX -VEX.66.W0.L1.0f3a06 RVMI Vx Hx Wx Ib VPERM2F128 F=AVX -VEX.66.0f3a08 RMI Vps Wps Ib - VROUNDPS F=AVX -VEX.66.0f3a09 RMI Vpd Wpd Ib - VROUNDPD F=AVX -VEX.66.LIG.0f3a0a RVMI Vdq Hdq Wss Ib VROUNDSS F=AVX -VEX.66.LIG.0f3a0b RVMI Vdq Hdq Wsd Ib VROUNDSD F=AVX -VEX.66.0f3a0c RVMI Vx Hx Wx Ib VBLENDPS F=AVX -VEX.66.0f3a0d RVMI Vx Hx Wx Ib VBLENDPD F=AVX -VEX.66.0f3a0e RVMI Vx Hx Wx Ib VPBLENDW F=AVX -VEX.66.0f3a0f RVMI Vx Hx Wx Ib VPALIGNR F=AVX -VEX.66.L0.0f3a14/m MRI Mb Vdq Ib - VPEXTRB F=AVX -VEX.66.L0.0f3a14/r MRI Rd Vdq Ib - VPEXTRB F=AVX -VEX.66.L0.0f3a15/m MRI Mw Vdq Ib - VPEXTRW F=AVX -VEX.66.L0.0f3a15/r MRI Rd Vdq Ib - VPEXTRW F=AVX -VEX.66.W0.L0.0f3a16 MRI Ey Vdq Ib - VPEXTRD F=AVX ENC_NOSZ -VEX.66.W1.L0.0f3a16 MRI Ey Vdq Ib - VPEXTRD I64 F=AVX ENC_NOSZ -VEX.66.W1.L0.0f3a16 MRI Ey Vdq Ib - VPEXTRQ O64 F=AVX ENC_NOSZ -VEX.66.L0.0f3a17 MRI Ed Vdq Ib - VEXTRACTPS F=AVX -VEX.66.W0.L1.0f3a18 RVMI Vx Hx Wdq Ib VINSERTF128 F=AVX ENC_NOSZ -VEX.66.W0.L1.0f3a19 MRI Wdq Vx Ib - VEXTRACTF128 F=AVX ENC_NOSZ -VEX.66.W0.0f3a1d MRI Wh Vx Ib - VCVTPS2PH F=F16C -VEX.66.L0.0f3a20 RVMI Vdq Hdq Eb Ib VPINSRB F=AVX -VEX.66.L0.0f3a21 RVMI Vdq Hdq Wd Ib VINSERTPS F=AVX -VEX.66.W0.L0.0f3a22 RVMI Vdq Hdq Ey Ib VPINSRD F=AVX ENC_NOSZ -VEX.66.W1.L0.0f3a22 RVMI Vdq Hdq Ey Ib VPINSRD I64 F=AVX ENC_NOSZ -VEX.66.W1.L0.0f3a22 RVMI Vdq Hdq Ey Ib VPINSRQ O64 F=AVX ENC_NOSZ -VEX.66.W0.L1.0f3a38 RVMI Vx Hx Wdq Ib VINSERTI128 F=AVX2 ENC_NOSZ -VEX.66.W0.L1.0f3a39 MRI Wdq Vx Ib - VEXTRACTI128 F=AVX2 ENC_NOSZ -VEX.66.0f3a40 RVMI Vx Hx Wx Ib VDPPS F=AVX -VEX.66.L0.0f3a41 RVMI Vx Hx Wx Ib VDPPD F=AVX -VEX.66.0f3a42 RVMI Vx Hx Wx Ib VMPSADBW F=AVX -VEX.66.0f3a44 RVMI Vx Hx Wx Ib VPCLMULQDQ F=PCLMULQDQ,AVX -VEX.66.W0.L1.0f3a46 RVMI Vx Hx Wx Ib VPERM2I128 F=AVX2 -VEX.66.W0.0f3a4a RVMR Vx Hx Wx Lx VBLENDVPS F=AVX -VEX.66.W0.0f3a4b RVMR Vx Hx Wx Lx VBLENDVPD F=AVX -VEX.66.W0.0f3a4c RVMR Vx Hx Wx Lx VPBLENDVB F=AVX -VEX.66.L0.0f3a60 RMI Vx Wx Ib - VPCMPESTRM F=AVX ENC_NOSZ -VEX.66.L0.0f3a61 RMI Vx Wx Ib - VPCMPESTRI F=AVX ENC_NOSZ -VEX.66.L0.0f3a62 RMI Vx Wx Ib - VPCMPISTRM F=AVX ENC_NOSZ -VEX.66.L0.0f3a63 RMI Vx Wx Ib - VPCMPISTRI F=AVX ENC_NOSZ -# -# BMI1 -VEX.NP.L0.0f38f2 RVM Gy By Ey - ANDN F=BMI1 EFL=0--mmuu0 -VEX.NP.L0.0f38f3/1 VM By Ey - - BLSR F=BMI1 EFL=0--mmuum -VEX.NP.L0.0f38f3/2 VM By Ey - - BLSMSK F=BMI1 EFL=0--m0uum -VEX.NP.L0.0f38f3/3 VM By Ey - - BLSI F=BMI1 EFL=0--mmuum -VEX.NP.L0.0f38f7 RMV Gy Ey By - BEXTR F=BMI1 EFL=0--umuu0 -# BMI2 -VEX.F2.L0.0f3af0 RMI Gy Ey Ib - RORX F=BMI2 -VEX.NP.L0.0f38f5 RMV Gy Ey By - BZHI F=BMI2 EFL=0--mmuum -VEX.F2.L0.0f38f5 RVM Gy By Ey - PDEP F=BMI2 -VEX.F3.L0.0f38f5 RVM Gy By Ey - PEXT F=BMI2 -VEX.F2.L0.0f38f6 RVM Gy By Ey - MULX F=BMI2 -VEX.66.L0.0f38f7 RMV Gy Ey By - SHLX F=BMI2 -VEX.F2.L0.0f38f7 RMV Gy Ey By - SHRX F=BMI2 -VEX.F3.L0.0f38f7 RMV Gy Ey By - SARX F=BMI2 -# ADX -66.0f38f6 RM Gy Ey - - ADCX F=ADX EFL=-------M -F3.0f38f6 RM Gy Ey - - ADOX F=ADX EFL=M------- -# -# FPU -# Source for UNDOC opcodes: https://www.sandpile.org/x86/opc_fpu.htm -d8/0m M Md - - - FADD F=387 ENC_SEPSZ -d8/1m M Md - - - FMUL F=387 ENC_SEPSZ -d8/2m M Md - - - FCOM F=387 ENC_SEPSZ -d8/3m M Md - - - FCOMP F=387 ENC_SEPSZ -d8/4m M Md - - - FSUB F=387 ENC_SEPSZ -d8/5m M Md - - - FSUBR F=387 ENC_SEPSZ -d8/6m M Md - - - FDIV F=387 ENC_SEPSZ -d8/7m M Md - - - FDIVR F=387 ENC_SEPSZ -d8/0r AM Ft Ft - - FADD F=387 -d8/1r AM Ft Ft - - FMUL F=387 -d8/2r AM Ft Ft - - FCOM F=387 -d8/3r AM Ft Ft - - FCOMP F=387 -d8/4r AM Ft Ft - - FSUB F=387 -d8/5r AM Ft Ft - - FSUBR F=387 -d8/6r AM Ft Ft - - FDIV F=387 -d8/7r AM Ft Ft - - FDIVR F=387 -d9/0m M Md - - - FLD F=387 ENC_SEPSZ -d9/2m M Md - - - FST F=387 ENC_SEPSZ -d9/3m M Md - - - FSTP F=387 ENC_SEPSZ -d9/4m M M - - - FLDENV F=387 -d9/5m M Mw - - - FLDCW F=387 -d9/6m M M - - - FSTENV F=387 -d9/7m M Mw - - - FSTCW F=387 -d9/0r M Ft - - - FLD F=387 -d9/1r M Ft - - - FXCH F=387 -d9d0 NP - - - - FNOP F=387 -d9/3r MA Ft Ft - - FSTPNCE F=387 UNDOC -d9e0 NP - - - - FCHS F=387 -d9e1 NP - - - - FABS F=387 -d9e4 NP - - - - FTST F=387 -d9e5 NP - - - - FXAM F=387 -d9e8 NP - - - - FLD1 F=387 -d9e9 NP - - - - FLDL2T F=387 -d9ea NP - - - - FLDL2E F=387 -d9eb NP - - - - FLDPI F=387 -d9ec NP - - - - FLDLG2 F=387 -d9ed NP - - - - FLDLN2 F=387 -d9ee NP - - - - FLDZ F=387 -d9f0 NP - - - - F2XM1 F=387 -d9f1 NP - - - - FYL2X F=387 -d9f2 NP - - - - FPTAN F=387 -d9f3 NP - - - - FPATAN F=387 -d9f4 NP - - - - FXTRACT F=387 -d9f5 NP - - - - FPREM1 F=387 -d9f6 NP - - - - FDECSTP F=387 -d9f7 NP - - - - FINCSTP F=387 -d9f8 NP - - - - FPREM F=387 -d9f9 NP - - - - FYL2XP1 F=387 -d9fa NP - - - - FSQRT F=387 -d9fb NP - - - - FSINCOS F=387 -d9fc NP - - - - FRNDINT F=387 -d9fd NP - - - - FSCALE F=387 -d9fe NP - - - - FSIN F=387 -d9ff NP - - - - FCOS F=387 -da/0m M Md - - - FIADD F=387 ENC_SEPSZ -da/1m M Md - - - FIMUL F=387 ENC_SEPSZ -da/2m M Md - - - FICOM F=387 ENC_SEPSZ -da/3m M Md - - - FICOMP F=387 ENC_SEPSZ -da/4m M Md - - - FISUB F=387 ENC_SEPSZ -da/5m M Md - - - FISUBR F=387 ENC_SEPSZ -da/6m M Md - - - FIDIV F=387 ENC_SEPSZ -da/7m M Md - - - FIDIVR F=387 ENC_SEPSZ -da/0r M Ft - - - FCMOVB F=686 EFL=-------t -da/1r M Ft - - - FCMOVE F=686 EFL=----t--- -da/2r M Ft - - - FCMOVBE F=686 EFL=----t--t -da/3r M Ft - - - FCMOVU F=686 EFL=------t- -dae9 NP - - - - FUCOMPP F=387 -db/0m M Md - - - FILD F=387 ENC_SEPSZ -db/1m M Md - - - FISTTP F=SSE3 ENC_SEPSZ -db/2m M Md - - - FIST F=387 ENC_SEPSZ -db/3m M Md - - - FISTP F=387 ENC_SEPSZ -db/5m M Mt - - - FLD F=387 ENC_SEPSZ -db/7m M Mt - - - FSTP F=387 ENC_SEPSZ -db/0r M Ft - - - FCMOVNB F=686 EFL=-------t -db/1r M Ft - - - FCMOVNE F=686 EFL=----t--- -db/2r M Ft - - - FCMOVNBE F=686 EFL=----t--t -db/3r M Ft - - - FCMOVNU F=686 EFL=------t- -dbe0 NP - - - - FENI8087_NOP F=387 UNDOC -dbe1 NP - - - - FDISI8087_NOP F=387 UNDOC -dbe2 NP - - - - FCLEX F=387 -dbe3 NP - - - - FINIT F=387 -dbe4 NP - - - - FSETPM287_NOP F=387 UNDOC -dbe5 NP - - - - FSETPM287_NOP F=387 UNDOC -db/5r M Ft - - - FUCOMI F=686 EFL=0--0m0mm -db/6r M Ft - - - FCOMI F=686 EFL=0--0m0mm -dc/0m M Mq - - - FADD F=387 ENC_SEPSZ -dc/1m M Mq - - - FMUL F=387 ENC_SEPSZ -dc/2m M Mq - - - FCOM F=387 ENC_SEPSZ -dc/3m M Mq - - - FCOMP F=387 ENC_SEPSZ -dc/4m M Mq - - - FSUB F=387 ENC_SEPSZ -dc/5m M Mq - - - FSUBR F=387 ENC_SEPSZ -dc/6m M Mq - - - FDIV F=387 ENC_SEPSZ -dc/7m M Mq - - - FDIVR F=387 ENC_SEPSZ -dc/0r MA Ft Ft - - FADD F=387 -dc/1r MA Ft Ft - - FMUL F=387 -dc/2r MA Ft Ft - - FCOM F=387 UNDOC -dc/3r MA Ft Ft - - FCOMP F=387 UNDOC -dc/4r MA Ft Ft - - FSUBR F=387 -dc/5r MA Ft Ft - - FSUB F=387 -dc/6r MA Ft Ft - - FDIVR F=387 -dc/7r MA Ft Ft - - FDIV F=387 -dd/0m M Mq - - - FLD F=387 ENC_SEPSZ -dd/1m M Mq - - - FISTTP F=387 ENC_SEPSZ -dd/2m M Mq - - - FST F=387 ENC_SEPSZ -dd/3m M Mq - - - FSTP F=387 ENC_SEPSZ -dd/4m M M - - - FRSTOR F=387 -dd/6m M M - - - FSAVE F=387 -dd/7m M Mw - - - FSTSW F=387 -dd/0r M Ft - - - FFREE F=387 -dd/1r AM Ft Ft - - FXCH F=387 UNDOC -dd/2r M Ft - - - FST F=387 -dd/3r M Ft - - - FSTP F=387 -dd/4r M Ft - - - FUCOM F=387 -dd/5r M Ft - - - FUCOMP F=387 -de/0m M Mw - - - FIADD F=387 ENC_SEPSZ -de/1m M Mw - - - FIMUL F=387 ENC_SEPSZ -de/2m M Mw - - - FICOM F=387 ENC_SEPSZ -de/3m M Mw - - - FICOMP F=387 ENC_SEPSZ -de/4m M Mw - - - FISUB F=387 ENC_SEPSZ -de/5m M Mw - - - FISUBR F=387 ENC_SEPSZ -de/6m M Mw - - - FIDIV F=387 ENC_SEPSZ -de/7m M Mw - - - FIDIVR F=387 ENC_SEPSZ -de/0r MA Ft Ft - - FADDP F=387 -de/1r MA Ft Ft - - FMULP F=387 -de/2r AM Ft Ft - - FCOMP F=387 UNDOC -ded9 NP - - - - FCOMPP F=387 -de/4r MA Ft Ft - - FSUBRP F=387 -de/5r MA Ft Ft - - FSUBP F=387 -de/6r MA Ft Ft - - FDIVRP F=387 -de/7r MA Ft Ft - - FDIVP F=387 -df/0m M Mw - - - FILD F=387 ENC_SEPSZ -df/1m M Mw - - - FISTTP F=387 ENC_SEPSZ -df/2m M Mw - - - FIST F=387 ENC_SEPSZ -df/3m M Mw - - - FISTP F=387 ENC_SEPSZ -df/4m M Mt - - - FBLD F=387 -df/5m M Mq - - - FILD F=387 ENC_SEPSZ -df/6m M Mt - - - FBSTP F=387 -df/7m M Mq - - - FISTP F=387 ENC_SEPSZ -df/0r M Ft - - - FFREEP F=387 UNDOC -df/1r AM Ft Ft - - FXCH F=387 UNDOC -df/2r MA Ft Ft - - FSTP F=387 UNDOC -df/3r MA Ft Ft - - FSTP F=387 UNDOC -# FSTSW AX -dfe0 A Rw - - - FSTSW F=387 -df/5r AM Ft Ft - - FUCOMIP F=686 EFL=0--0m0mm -df/6r AM Ft Ft - - FCOMIP F=686 EFL=0--0m0mm -# -# Control Flow Enforcement -F3.0f01/5m M Mq - - - RSTORSSP F=CET -F3.0f01e8 NP - - - - SETSSBSY F=CET CPL0 -F3.0f01ea NP - - - - SAVEPREVSSP F=CET -F3.0f1e/1r M Ry - - - RDSSP F=CET -F3.0f1efa NP - - - - ENDBR64 F=CET -F3.0f1efb NP - - - - ENDBR32 F=CET -66.0f38f5/m MR My Gy - - WRUSS F=CET -NP.0f38f6/m MR My Gy - - WRSS F=CET -F3.0fae/6m M Mq - - - CLRSSBSY F=CET CPL0 -F3.0fae/5r M Ry - - - INCSSP F=CET -# -# CLDEMOTE -NP.0f1c/0m M Mb - - - CLDEMOTE F=CLDEMOTE - -# VIA PadLock -F3.0fa6c0 NP - - - - REP_MONTMUL F=PADLOCK ONLYVIA -F3.0fa6c8 NP - - - - REP_XSHA1 F=PADLOCK ONLYVIA -F3.0fa6d0 NP - - - - REP_XSHA256 F=PADLOCK ONLYVIA -NFx.0fa7c0 NP - - - - XSTORE F=PADLOCK ONLYVIA -F3.0fa7c0 NP - - - - REP_XSTORE F=PADLOCK ONLYVIA -F3.0fa7c8 NP - - - - REP_XCRYPTECB F=PADLOCK ONLYVIA -F3.0fa7d0 NP - - - - REP_XCRYPTCBC F=PADLOCK ONLYVIA -F3.0fa7d8 NP - - - - REP_XCRYPTCTR F=PADLOCK ONLYVIA -F3.0fa7e0 NP - - - - REP_XCRYPTCFB F=PADLOCK ONLYVIA -F3.0fa7e8 NP - - - - REP_XCRYPTOFB F=PADLOCK ONLYVIA - -# VMX -66.0f3880/m RM Gy Mdq - - INVEPT D64 F=VMX EFL=0--0m00m CPL0 -66.0f3881/m RM Gy Mdq - - INVVPID D64 F=VMX EFL=0--0m00m CPL0 -NP.0f01c1 NP - - - - VMCALL F=VMX EFL=0--0m00m CPL0 -66.0fc7/6m M Mq - - - VMCLEAR F=VMX EFL=0--0m00m CPL0 -NP.0f01d4 NP - - - - VMFUNC F=VMX EFL=0--0m00m -NP.0f01c2 NP - - - - VMLAUNCH F=VMX EFL=0--0m00m CPL0 -NP.0f01c3 NP - - - - VMRESUME F=VMX EFL=0--0m00m CPL0 -NP.0fc7/6m M Mq - - - VMPTRLD F=VMX EFL=0--0m00m CPL0 -NP.0fc7/7m M Mq - - - VMPTRST F=VMX EFL=0--0m00m CPL0 -NP.0f78 MR Ey Gy - - VMREAD D64 F=VMX EFL=0--0m00m CPL0 -NP.0f79 RM Gy Ey - - VMWRITE D64 F=VMX EFL=0--0m00m CPL0 -NP.0f01c4 NP - - - - VMXOFF F=VMX EFL=0--0m00m CPL0 -F3.0fc7/6m M Mq - - - VMXON F=VMX EFL=0--0m00m CPL0 -# SEAM/TDX -66.0f01cc NP - - - - TDCALL F=SEAM -66.0f01cd NP - - - - SEAMRET F=SEAM -66.0f01ce NP - - - - SEAMOPS F=SEAM -66.0f01cf NP - - - - SEAMCALL F=SEAM - -# AMD CLZERO -0f01fc A Rv - - - CLZERO F=CLZERO ONLYAMD - -# AMD RDPRU -# Tested on hardware, 66 prefix also accepted. F2/F3 trigger UD. -NFx.0f01fd NP - - - - RDPRU F=RDPRU ONLYAMD - -# AMD SVM -0f01d8 NP - - - - VMRUN F=SVM ONLYAMD CPL0 -NFx.0f01d9 NP - - - - VMMCALL F=SVM ONLYAMD -F3.0f01d9 NP - - - - VMGEXIT F=SEVES ONLYAMD -F2.0f01d9 NP - - - - VMGEXIT F=SEVES ONLYAMD -0f01da NP - - - - VMLOAD F=SVM ONLYAMD CPL0 -0f01db NP - - - - VMSAVE F=SVM ONLYAMD CPL0 -0f01dc NP - - - - STGI F=SKINIT ONLYAMD CPL0 -0f01dd NP - - - - CLGI F=SKINIT ONLYAMD CPL0 -0f01de NP - - - - SKINIT EFL=00000000 F=SKINIT ONLYAMD CPL0 -0f01df NP - - - - INVLPGA F=SVM ONLYAMD CPL0 -NP.0f01fa NP - - - - MONITORX F=MONITORX ONLYAMD -F3.0f01fa NP - - - - MCOMMIT F=MCOMMIT ONLYAMD -NP.0f01fb NP - - - - MWAITX F=MONITORX ONLYAMD -NP.0f01fe NP - - - - INVLPGB F=INVLPGB ONLYAMD CPL0 -NP.0f01ff NP - - - - TLBSYNC F=INVLPGB ONLYAMD CPL0 - -# AMD SNP -F3.0f01fd NP - - - - RMPQUERY O64 EFL=m--mmmm- F=RMPQUERY ONLYAMD CPL0 -F2.0f01fd NP - - - - RMPREAD O64 EFL=m--mmmm- F=RMPREAD ONLYAMD CPL0 -F3.0f01fe NP - - - - RMPADJUST O64 EFL=m--mmmm- F=SNP ONLYAMD CPL0 -F2.0f01fe NP - - - - RMPUPDATE O64 EFL=m--mmmm- F=SNP ONLYAMD CPL0 -F3.0f01ff NP - - - - PSMASH O64 EFL=m--mmmm- F=SNP ONLYAMD -F2.0f01ff NP - - - - PVALIDATE O64 EFL=m--mmmmm F=SNP ONLYAMD - -# WAITPKG -66.0fae/6r M Rd - - - TPAUSE F=WAITPKG EFL=0--0000m -# TODO: Ry operand is address-sized -F3.0fae/6r M Ry - - - UMONITOR F=WAITPKG -F2.0fae/6r M Rd - - - UMWAIT F=WAITPKG EFL=0--0000m - -# PRWRITE -F3.0fae/4 M Ey - - - PTWRITE F=PTWRITE - -# GFNI -66.0f38cf RM Vx Wx - - GF2P8MULB F=GFNI -66.0f3ace RMI Vx Wx Ib - GF2P8AFFINEQB F=GFNI -66.0f3acf RMI Vx Wx Ib - GF2P8AFFINEINVQB F=GFNI -VEX.66.W0.0f38cf RVM Vx Hx Wx - VGF2P8MULB F=AVX,GFNI -VEX.66.W1.0f3ace RVMI Vx Hx Wx Ib VGF2P8AFFINEQB F=AVX,GFNI -VEX.66.W1.0f3acf RVMI Vx Hx Wx Ib VGF2P8AFFINEINVQB F=AVX,GFNI -EVEX.66.W0.0f38cf RVM Vx Hx Wx - EVX_GF2P8MULB+k F=AVX,GFNI TUPLE_FULL_MEM -EVEX.66.W1.0f3ace RVMI Vx Hx Wx Ib EVX_GF2P8AFFINEQB+kb F=AVX512F,GFNI TUPLE_FULL_64 -EVEX.66.W1.0f3acf RVMI Vx Hx Wx Ib EVX_GF2P8AFFINEINVQB+kb F=AVX512F,GFNI TUPLE_FULL_64 - -# ENQCMD -# TODO: Gy operands are address-sized -F2.0f38f8/m RM Gy Moq - - ENQCMD F=ENQCMD -F3.0f38f8/m RM Gy Moq - - ENQCMDS F=ENQCMD - -# PCONFIG -NP.0f01c5 NP - - - - PCONFIG F=PCONFIG - -# WBNOINVD -F3.0f09 NP - - - - WBNOINVD F=WBNOINVD CPL0 - -NP.0f01ee NP - - - - RDPKRU F=OSPKE -NP.0f01ef NP - - - - WRPKRU F=OSPKE -F3.0fae/0r M Ry - - - RDFSBASE O64 F=FSGSBASE -F3.0fae/1r M Ry - - - RDGSBASE O64 F=FSGSBASE -F3.0fae/2r M Ry - - - WRFSBASE O64 F=FSGSBASE -F3.0fae/3r M Ry - - - WRGSBASE O64 F=FSGSBASE -NP.0fae/4m M M - - - XSAVE+w F=XSAVE -NP.0fae/5m M M - - - XRSTOR+w F=XSAVE -NP.0fae/6m M M - - - XSAVEOPT+w F=XSAVEOPT -66.0fae/6m M Mb - - - CLWB F=CLWB -NP.0fae/7m M Mb - - - CLFLUSH F=CLFLSH -66.0fae/7m M Mb - - - CLFLUSHOPT F=CLFLUSHOPT -NP.0fc7/3m M M - - - XRSTORS+w F=XSS -NP.0fc7/4m M M - - - XSAVEC+w F=XSAVEC -NP.0fc7/5m M M - - - XSAVES+w F=XSS -NFx.0fc7/6r M Rv - - - RDRAND F=RDRAND EFL=0--0000m -NFx.0fc7/7r M Rv - - - RDSEED F=RDSEED EFL=0--0000m -F3.0fc7/7r M Ry - - - RDPID D64 F=RDPID -66.0f3882/m RM Gy Mdq - - INVPCID D64 F=INVPCID CPL0 -NP.0f38c8 RM Vdq Wdq - - SHA1NEXTE F=SHA -NP.0f38c9 RM Vdq Wdq - - SHA1MSG1 F=SHA -NP.0f38ca RM Vdq Wdq - - SHA1MSG2 F=SHA -NP.0f38cb RMA Vdq Wdq Hdq - SHA256RNDS2 F=SHA -NP.0f38cc RM Vdq Wdq - - SHA256MSG1 F=SHA -NP.0f38cd RM Vdq Wdq - - SHA256MSG2 F=SHA -NP.0f3acc RMI Vdq Wdq Ib - SHA1RNDS4 F=SHA - -#NP.0f1a/m RM Z M - - BNDLDX F=MPX -#66.0f1a RM Z Z - - BNDMOV D64 F=MPX -#F2.0f1a RM Z Ey - - BNDCU D64 F=MPX -#F3.0f1a RM Z Ey - - BNDCL D64 F=MPX -#NP.0f1b/m MR M Z - - BNDSTX F=MPX -#66.0f1b MR Z Z - - BNDMOV D64 F=MPX -#F2.0f1b RM Z Ey - - BNDCN D64 F=MPX -#F3.0f1b/m RM Z M - - BNDMK F=MPX - -# TSXLDTRK -F2.0f01e8 NP - - - - XSUSLDTRK F=TSXLDTRK -F2.0f01e9 NP - - - - XRESLDTRK F=TSXLDTRK - -# AVX_VNNI -VEX.NP.W0.0f3850 RVM Vx Hx Wx - VPDPBUUD F=VNNI-INT8 -VEX.66.W0.0f3850 RVM Vx Hx Wx - VPDPBUSD F=VNNI -VEX.F3.W0.0f3850 RVM Vx Hx Wx - VPDPBSUD F=VNNI-INT8 -VEX.F2.W0.0f3850 RVM Vx Hx Wx - VPDPBSSD F=VNNI-INT8 -VEX.NP.W0.0f3851 RVM Vx Hx Wx - VPDPBUUDS F=VNNI-INT8 -VEX.66.W0.0f3851 RVM Vx Hx Wx - VPDPBUSDS F=VNNI -VEX.F3.W0.0f3851 RVM Vx Hx Wx - VPDPBSUDS F=VNNI-INT8 -VEX.F2.W0.0f3851 RVM Vx Hx Wx - VPDPBSSDS F=VNNI-INT8 -VEX.66.W0.0f3852 RVM Vx Hx Wx - VPDPWSSD F=VNNI -VEX.66.W0.0f3853 RVM Vx Hx Wx - VPDPWSSDS F=VNNI - -# AVX-NE-CONVERT -VEX.NP.W0.0f38b0/m RM Vx Mx - - VCVTNEOPH2PS F=AVX-NE-CONVERT -VEX.66.W0.0f38b0/m RM Vx Mx - - VCVTNEEPH2PS F=AVX-NE-CONVERT -VEX.F3.W0.0f38b0/m RM Vx Mx - - VCVTNEEBF162PS F=AVX-NE-CONVERT -VEX.F2.W0.0f38b0/m RM Vx Mx - - VCVTNEOBF162PS F=AVX-NE-CONVERT -VEX.66.W0.0f38b1/m RM Vx Mw - - VBCSTNESH2PS F=AVX-NE-CONVERT -VEX.F3.W0.0f38b1/m RM Vx Mw - - VBCSTNEBF162PS F=AVX-NE-CONVERT -VEX.F3.W0.0f3872 RM Vh Wps - - VCVTNEPS2BF16 F=AVX-NE-CONVERT - -# AVX-IFMA -VEX.66.W1.0f38b4 RVM Vx Hx Wx - VPMADD52LUQ F=AVX-IFMA -VEX.66.W1.0f38b5 RVM Vx Hx Wx - VPMADD52HUQ F=AVX-IFMA - -# HRESET -F3.0f3af0c0 I Ib - - - HRESET F=HRESET - -# SERIALIZE -NP.0f01e8 NP - - - - SERIALIZE F=SERIALIZE - -# UINTR -F3.0f01ec NP - - - - UIRET O64 F=UINTR -F3.0f01ed NP - - - - TESTUI O64 F=UINTR -F3.0f01ee NP - - - - CLUI O64 F=UINTR -F3.0f01ef NP - - - - STUI O64 F=UINTR -F3.0fc7/6r M Ry - - - SENDUIPI O64 D64 F=UINTR - -# WRMSRNS -NP.0f01c6 NP - - - - WRMSRNS F=WRMSRNS CPL0 - -# MSRLIST -F2.0f01c6 NP - - - - RDMSRLIST O64 F=MSRLIST CPL0 -F3.0f01c6 NP - - - - WRMSRLIST O64 F=MSRLIST CPL0 - -# RAO-INT -NP.0f38fc/m MR My Gy - - AADD F=RAO-INT -66.0f38fc/m MR My Gy - - AAND F=RAO-INT -F3.0f38fc/m MR My Gy - - AXOR F=RAO-INT -F2.0f38fc/m MR My Gy - - AOR F=RAO-INT - -# CMPCCXADD -VEX.66.L0.0f38e0/m MRV My Gy By - CMPOXADD O64 F=CMPCCXADD EFL=m--mmmmm ENC_CC_BEGIN -VEX.66.L0.0f38e1/m MRV My Gy By - CMPNOXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e2/m MRV My Gy By - CMPBXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e3/m MRV My Gy By - CMPNBXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e4/m MRV My Gy By - CMPZXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e5/m MRV My Gy By - CMPNZXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e6/m MRV My Gy By - CMPBEXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e7/m MRV My Gy By - CMPNBEXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e8/m MRV My Gy By - CMPSXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38e9/m MRV My Gy By - CMPNSXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38ea/m MRV My Gy By - CMPPXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38eb/m MRV My Gy By - CMPNPXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38ec/m MRV My Gy By - CMPLXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38ed/m MRV My Gy By - CMPNLXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38ee/m MRV My Gy By - CMPLEXADD O64 F=CMPCCXADD EFL=m--mmmmm -VEX.66.L0.0f38ef/m MRV My Gy By - CMPNLEXADD O64 F=CMPCCXADD EFL=m--mmmmm - -# AESKLE/KL (Key Locker) -F3.0f38d8/0m M M - - - AESENCWIDE128KL F=AESKLE -F3.0f38d8/1m M M - - - AESDECWIDE128KL F=AESKLE -F3.0f38d8/2m M M - - - AESENCWIDE256KL F=AESKLE -F3.0f38d8/3m M M - - - AESDECWIDE256KL F=AESKLE -F3.0f38dc/m RM Vx M - - AESENC128KL F=AESKLE -F3.0f38dc/r RM Vx Ux - - LOADIWKEY F=AESKLE -F3.0f38dd/m RM Vx M - - AESDEC128KL F=AESKLE -F3.0f38de/m RM Vx M - - AESENC256KL F=AESKLE -F3.0f38df/m RM Vx M - - AESDEC256KL F=AESKLE -F3.0f38fa/r RM Gd Rd - - ENCODEKEY128 F=AESKLE -F3.0f38fb/r RM Gd Rd - - ENCODEKEY256 F=AESKLE - -# FRED -F2.0f00/6 M Ew - - - LKGS F=FRED -F3.0f01ca NP - - - - ERETU F=FRED -F2.0f01ca NP - - - - ERETS F=FRED - -# AMX -VEX.NP.W0.L0.0f3849/0m M M - - - LDTILECFG O64 F=AMX-TILE -VEX.66.W0.L0.0f3849/0m M M - - - STTILECFG O64 F=AMX-TILE -VEX.NP.W0.L0.0f3849c0 NP - - - - TILERELEASE O64 F=AMX-TILE -VEX.F2.W0.L0.0f3849/r0 R T - - - TILEZERO O64 F=AMX-TILE -VEX.66.W0.L0.0f384b/m4 RM T M - - TILELOADDT1 O64 F=AMX-TILE -VEX.F3.W0.L0.0f384b/m4 MR M T - - TILESTORED O64 F=AMX-TILE -VEX.F2.W0.L0.0f384b/m4 RM T M - - TILELOADD O64 F=AMX-TILE -VEX.F3.W0.L0.0f385c/r RMV T T T - TDPBF16PS O64 F=AMX-BF16 -VEX.F2.W0.L0.0f385c/r RMV T T T - TDPFP16PS O64 F=AMX-FP16 -VEX.NP.W0.L0.0f385e/r RMV T T T - TDPBUUD O64 F=AMX-INT8 -VEX.66.W0.L0.0f385e/r RMV T T T - TDPBUSD O64 F=AMX-INT8 -VEX.F3.W0.L0.0f385e/r RMV T T T - TDPBSUD O64 F=AMX-INT8 -VEX.F2.W0.L0.0f385e/r RMV T T T - TDPBSSD O64 F=AMX-INT8 -VEX.NP.W0.L0.0f386c/r RMV T T T - TCMMRLFP16PS O64 F=AMX-COMPLEX -VEX.66.W0.L0.0f386c/r RMV T T T - TCMMIMFP16PS O64 F=AMX-COMPLEX - -# PBNDKB -NP.0f01c7 NP - - - - PBNDKB O64 F=PBNDKB CPL0 - -# MSR_IMM -VEX.F2.W0.L0.M7.f6/0r MI Rq Id - - RDMSR O64 F=MSR_IMM CPL0 -VEX.F3.W0.L0.M7.f6/0r IM Id Rq - - WRMSRNS O64 F=MSR_IMM CPL0 - -# USER_MSR -F2.0f38f8/r MR Rq Gq - - URDMSR O64 F=USER_MSR -F3.0f38f8/r MR Rq Gq - - UWRMSR O64 F=USER_MSR -VEX.F2.W0.L0.M7.f8/0r MI Rq Id - - URDMSR O64 F=USER_MSR -VEX.F3.W0.L0.M7.f8/0r IM Id Rq - - UWRMSR O64 F=USER_MSR - -# SM4 -VEX.F3.W0.0f38da RVM Vx Hx Wx - VSM4KEY4 F=AVX,SM4 -VEX.F2.W0.0f38da RVM Vx Hx Wx - VSM4RNDS4 F=AVX,SM4 -EVEX.F3.W0.0f38da RVM Vx Hx Wx - VSM4KEY4 F=AVX10.2,SM4 TUPLE_FULL_MEM -EVEX.F2.W0.0f38da RVM Vx Hx Wx - VSM4RNDS4 F=AVX10.2,SM4 TUPLE_FULL_MEM - -# AVX512 -EVEX.NP.W0.0f58 RVM Vps Hps Wps - EVX_ADDPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f58 RVM Vpd Hpd Wpd - EVX_ADDPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f58 RVM Vdq Hdq Wss - EVX_ADDSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f58 RVM Vdq Hdq Wsd - EVX_ADDSD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.0f38dc RVM Vx Hx Wx - EVX_AESENC F=AVX512F,VAES TUPLE_FULL_MEM -EVEX.66.0f38dd RVM Vx Hx Wx - EVX_AESENCLAST F=AVX512F,VAES TUPLE_FULL_MEM -EVEX.66.0f38de RVM Vx Hx Wx - EVX_AESDEC F=AVX512F,VAES TUPLE_FULL_MEM -EVEX.66.0f38df RVM Vx Hx Wx - EVX_AESDECLAST F=AVX512F,VAES TUPLE_FULL_MEM -EVEX.NP.W0.0f54 RVM Vps Hps Wps - EVX_ANDPS+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f54 RVM Vpd Hpd Wpd - EVX_ANDPD+kb F=AVX512DQ TUPLE_FULL_64 -EVEX.NP.W0.0f55 RVM Vps Hps Wps - EVX_ANDNPS+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f55 RVM Vpd Hpd Wpd - EVX_ANDNPD+kb F=AVX512DQ TUPLE_FULL_64 -EVEX.NP.W0.0fc2 RVMI Kb Hps Wps Ib EVX_CMPPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fc2 RVMI Kb Hpd Wpd Ib EVX_CMPPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0fc2 RVMI Kb Hss Wss Ib EVX_CMPSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0fc2 RVMI Kb Hsd Wsd Ib EVX_CMPSD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.LIG.0f2f RM Vss Wss - - EVX_COMISS+e F=AVX512F TUPLE1_SCALAR_32 EFL=0--0m0mm -EVEX.66.W1.LIG.0f2f RM Vsd Wsd - - EVX_COMISD+e F=AVX512F TUPLE1_SCALAR_64 EFL=0--0m0mm -# Note: SAE is ignored -EVEX.F3.W0.0fe6 RM Vpd Wh - - EVX_CVTDQ2PD+kbe F=AVX512F TUPLE_HALF_32 -EVEX.F2.W1.0fe6 RM Vh Wpd - - EVX_CVTPD2DQ+kbr F=AVX512F TUPLE_FULL_64 -EVEX.NP.W0.0f5b RM Vps Wps - - EVX_CVTDQ2PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W0.0f5b RM Vps Wps - - EVX_CVTPS2DQ+kbr F=AVX512F TUPLE_FULL_32 -EVEX.NP.W0.0f5a RM Vpd Wh - - EVX_CVTPS2PD+kbe F=AVX512F TUPLE_HALF_32 -EVEX.66.W1.0f5a RM Vh Wpd - - EVX_CVTPD2PS+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.LIG.0f2d RM Gy Wss - - EVX_CVTSS2SI+r F=AVX512F TUPLE1_FIXED_32 -EVEX.F2.LIG.0f2d RM Gy Wsd - - EVX_CVTSD2SI+r F=AVX512F TUPLE1_FIXED_64 -EVEX.F3.W0.LIG.0f5a RVM Vdq Hdq Wss - EVX_CVTSS2SD+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f5a RVM Vdq Hdq Wsd - EVX_CVTSD2SS+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.F3.LIG.0f2a RVM Vdq Hdq Ey - EVX_CVTSI2SS+r F=AVX512F TUPLE1_SCALAR_OPSZ -# Note: for W0, ER is ignored (i.e., will not UD, according to Intel SDM) -EVEX.F2.LIG.0f2a RVM Vdq Hdq Ey - EVX_CVTSI2SD+r F=AVX512F TUPLE1_SCALAR_OPSZ -EVEX.66.W1.0fe6 RM Vh Wpd - - EVX_CVTTPD2DQ+kbe F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.0f5b RM Vps Wps - - EVX_CVTTPS2DQ+kbe F=AVX512F TUPLE_FULL_32 -EVEX.F2.LIG.0f2c RM Gy Wsd - - EVX_CVTTSD2SI+e F=AVX512F TUPLE1_FIXED_64 -EVEX.F3.LIG.0f2c RM Gy Wss - - EVX_CVTTSS2SI+e F=AVX512F TUPLE1_FIXED_32 -EVEX.NP.W0.0f5e RVM Vps Hps Wps - EVX_DIVPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f5e RVM Vpd Hpd Wpd - EVX_DIVPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f5e RVM Vdq Hdq Wss - EVX_DIVSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f5e RVM Vdq Hdq Wsd - EVX_DIVSD+kr F=AVX512F TUPLE1_SCALAR_64 -# Note: tuple size is actually fixed at 32 bits, regardless of EVEX.W -EVEX.66.L0.0f3a17 MRI Ess Vdq Ib - EVX_EXTRACTPS F=AVX512F TUPLE1_FIXED_32 -EVEX.66.W0.L0.0f3a21 RVMI Vdq Hdq Wss Ib EVX_INSERTPS F=AVX512F TUPLE1_SCALAR_32 -EVEX.NP.W0.0f5f RVM Vps Hps Wps - EVX_MAXPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f5f RVM Vpd Hpd Wpd - EVX_MAXPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f5f RVM Vdq Hdq Wss - EVX_MAXSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f5f RVM Vdq Hdq Wsd - EVX_MAXSD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.0f5d RVM Vps Hps Wps - EVX_MINPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f5d RVM Vpd Hpd Wpd - EVX_MINPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f5d RVM Vdq Hdq Wss - EVX_MINSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f5d RVM Vdq Hdq Wsd - EVX_MINSD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.0f28 RM Vps Wps - - EVX_MOVAPS+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f28 RM Vpd Wpd - - EVX_MOVAPD+k F=AVX512F TUPLE_FULL_MEM -EVEX.NP.W0.0f29 MR Wps Vps - - EVX_MOVAPS+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f29 MR Wpd Vpd - - EVX_MOVAPD+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.L0.0f7e MR Ey Vy - - EVX_MOV_X2G F=AVX512F TUPLE1_SCALAR_OPSZ -EVEX.66.L0.0f6e RM Vy Ey - - EVX_MOV_G2X F=AVX512F TUPLE1_SCALAR_OPSZ -EVEX.F2.W1.L0.0f12 RM Vpd Wq - - EVX_MOVDDUP+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.F2.W1.L12.0f12 RM Vpd Wpd - - EVX_MOVDDUP+k F=AVX512F TUPLE_MOVDDUP -EVEX.66.W0.0f6f RM Vx Wx - - EVX_MOVDQA32+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f6f RM Vx Wx - - EVX_MOVDQA64+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W0.0f7f MR Wx Vx - - EVX_MOVDQA32+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f7f MR Wx Vx - - EVX_MOVDQA64+k F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W0.0f6f RM Vx Wx - - EVX_MOVDQU32+k F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W1.0f6f RM Vx Wx - - EVX_MOVDQU64+k F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W0.0f7f MR Wx Vx - - EVX_MOVDQU32+k F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W1.0f7f MR Wx Vx - - EVX_MOVDQU64+k F=AVX512F TUPLE_FULL_MEM -EVEX.F2.W0.0f6f RM Vx Wx - - EVX_MOVDQU8+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F2.W1.0f6f RM Vx Wx - - EVX_MOVDQU16+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F2.W0.0f7f MR Wx Vx - - EVX_MOVDQU8+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F2.W1.0f7f MR Wx Vx - - EVX_MOVDQU16+k F=AVX512BW TUPLE_FULL_MEM -EVEX.NP.W0.L0.0f12/m RVM Vdq Hdq Mq - EVX_MOVLPS F=AVX512F TUPLE2_32 -EVEX.NP.W0.L0.0f12/r RVM Vdq Hdq Udq - EVX_MOVHLPS F=AVX512F -EVEX.66.W1.L0.0f12/m RVM Vdq Hdq Msd - EVX_MOVLPD F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.L0.0f13/m MR Mq Vq - - EVX_MOVLPS F=AVX512F TUPLE2_32 -EVEX.66.W1.L0.0f13/m MR Msd Vsd - - EVX_MOVLPD F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.L0.0f16/m RVM Vdq Hq Mq - EVX_MOVHPS F=AVX512F TUPLE2_32 -EVEX.NP.W0.L0.0f16/r RVM Vdq Hq Uq - EVX_MOVLHPS F=AVX512F -EVEX.66.W1.L0.0f16/m RVM Vdq Hsd Msd - EVX_MOVHPD F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.L0.0f17/m MR Mq Vq - - EVX_MOVHPS F=AVX512F TUPLE2_32 -EVEX.66.W1.L0.0f17/m MR Msd Vsd - - EVX_MOVHPD F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f382a/m RM Vx Mx - - EVX_MOVNTDQA F=AVX512F TUPLE_FULL_MEM -EVEX.66.W0.0fe7/m MR Mx Vx - - EVX_MOVNTDQ F=AVX512F TUPLE_FULL_MEM -EVEX.NP.W0.0f2b/m MR Mps Vps - - EVX_MOVNTPS F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f2b/m MR Mpd Vpd - - EVX_MOVNTPD F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W1.L0.0f7e RM Vq Wq - - EVX_MOVQ F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W1.L0.0fd6 MR Wq Vq - - EVX_MOVQ F=AVX512F TUPLE1_SCALAR_64 -EVEX.F3.W0.LIG.0f10/m RM Vdq Mss - - EVX_MOVSS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.F3.W0.LIG.0f10/r RVM Vdq Hdq Uss - EVX_MOVSS+k F=AVX512F -EVEX.F2.W1.LIG.0f10/m RM Vdq Msd - - EVX_MOVSD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.F2.W1.LIG.0f10/r RVM Vdq Hdq Usd - EVX_MOVSD+k F=AVX512F -EVEX.F3.W0.LIG.0f11/m MR Mss Vss - - EVX_MOVSS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.F3.W0.LIG.0f11/r MVR Udq Hdq Vss - EVX_MOVSS+k F=AVX512F -EVEX.F2.W1.LIG.0f11/m MR Msd Vsd - - EVX_MOVSD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.F2.W1.LIG.0f11/r MVR Udq Hdq Vsd - EVX_MOVSD+k F=AVX512F -EVEX.F3.W0.0f12 RM Vps Wps - - EVX_MOVSLDUP+k F=AVX512F TUPLE_FULL_MEM -EVEX.F3.W0.0f16 RM Vps Wps - - EVX_MOVSHDUP+k F=AVX512F TUPLE_FULL_MEM -EVEX.NP.W0.0f10 RM Vps Wps - - EVX_MOVUPS+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f10 RM Vpd Wpd - - EVX_MOVUPD+k F=AVX512F TUPLE_FULL_MEM -EVEX.NP.W0.0f11 MR Wps Vps - - EVX_MOVUPS+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W1.0f11 MR Wpd Vpd - - EVX_MOVUPD+k F=AVX512F TUPLE_FULL_MEM -EVEX.NP.W0.0f59 RVM Vps Hps Wps - EVX_MULPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f59 RVM Vpd Hpd Wpd - EVX_MULPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f59 RVM Vdq Hdq Wss - EVX_MULSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f59 RVM Vdq Hdq Wsd - EVX_MULSD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.0f56 RVM Vps Hps Wps - EVX_ORPS+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f56 RVM Vpd Hpd Wpd - EVX_ORPD+kb F=AVX512DQ TUPLE_FULL_64 -EVEX.66.0f381c RM Vx Wx - - EVX_PABSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f381d RM Vx Wx - - EVX_PABSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f381e RM Vx Wx - - EVX_PABSD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f381f RM Vx Wx - - EVX_PABSQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f63 RVM Vx Hx Wx - EVX_PACKSSWB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f67 RVM Vx Hx Wx - EVX_PACKUSWB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f6b RVM Vx Hx Wx - EVX_PACKSSDW+kb F=AVX512BW TUPLE_FULL_32 -EVEX.66.W0.0f382b RVM Vx Hx Wx - EVX_PACKUSDW+kb F=AVX512BW TUPLE_FULL_32 -EVEX.66.0ffc RVM Vx Hx Wx - EVX_PADDB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0ffd RVM Vx Hx Wx - EVX_PADDW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0ffe RVM Vx Hx Wx - EVX_PADDD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fd4 RVM Vx Hx Wx - EVX_PADDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0fec RVM Vx Hx Wx - EVX_PADDSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fed RVM Vx Hx Wx - EVX_PADDSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fdc RVM Vx Hx Wx - EVX_PADDUSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fdd RVM Vx Hx Wx - EVX_PADDUSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f3a0f RVMI Vx Hx Wx Ib EVX_PALIGNR+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0fdb RVM Vx Hx Wx - EVX_PANDD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fdb RVM Vx Hx Wx - EVX_PANDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0fdf RVM Vx Hx Wx - EVX_PANDND+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fdf RVM Vx Hx Wx - EVX_PANDNQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0fe0 RVM Vx Hx Wx - EVX_PAVGB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fe3 RVM Vx Hx Wx - EVX_PAVGW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f3a44 RVMI Vx Hx Wx Ib EVX_PCLMULQDQ F=AVX512F,VPCLMULQDQ TUPLE_FULL_MEM -EVEX.66.0f74 RVM K Hx Wx - EVX_PCMPEQB+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.0f75 RVM K Hx Wx - EVX_PCMPEQW+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W0.0f76 RVM K Hx Wx - EVX_PCMPEQD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3829 RVM K Hx Wx - EVX_PCMPEQQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f64 RVM K Hx Wx - EVX_PCMPGTB+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.0f65 RVM K Hx Wx - EVX_PCMPGTW+k F=AVX512F TUPLE_FULL_MEM -EVEX.66.W0.0f66 RVM K Hx Wx - EVX_PCMPGTD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3837 RVM K Hx Wx - EVX_PCMPGTQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.L0.0f3a14/m MRI Mb Vdq Ib - EVX_PEXTRB F=AVX512BW TUPLE1_SCALAR_8 -EVEX.66.L0.0f3a14/r MRI Rd Vdq Ib - EVX_PEXTRB F=AVX512BW -EVEX.66.L0.0fc5/r RMI Gd Udq Ib - EVX_PEXTRW F=AVX512BW -EVEX.66.L0.0f3a15/m MRI Mw Vdq Ib - EVX_PEXTRW F=AVX512BW TUPLE1_SCALAR_16 -EVEX.66.L0.0f3a15/r MRI Rd Vdq Ib - EVX_PEXTRW F=AVX512BW -EVEX.66.L0.0f3a16 MRI Ey Vdq Ib - EVX_PEXTR F=AVX512DQ TUPLE1_SCALAR_OPSZ -EVEX.66.L0.0f3a20 RVMI Vdq Hdq Eb Ib EVX_PINSR F=AVX512BW TUPLE1_SCALAR_8 -EVEX.66.L0.0fc4 RVMI Vdq Hdq Ew Ib EVX_PINSR F=AVX512BW TUPLE1_SCALAR_16 -EVEX.66.L0.0f3a22 RVMI Vdq Hdq Ey Ib EVX_PINSR F=AVX512DQ TUPLE1_SCALAR_OPSZ -EVEX.66.0f3804 RVM Vx Hx Wx - EVX_PMADDUBSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0ff5 RVM Vx Hx Wx - EVX_PMADDWD+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fda RVM Vx Hx Wx - EVX_PMINUB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fde RVM Vx Hx Wx - EVX_PMAXUB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fea RVM Vx Hx Wx - EVX_PMINSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fee RVM Vx Hx Wx - EVX_PMAXSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f3838 RVM Vx Hx Wx - EVX_PMINSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3839 RVM Vx Hx Wx - EVX_PMINSD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3839 RVM Vx Hx Wx - EVX_PMINSQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f383a RVM Vx Hx Wx - EVX_PMINUW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f383b RVM Vx Hx Wx - EVX_PMINUD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f383b RVM Vx Hx Wx - EVX_PMINUQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f383c RVM Vx Hx Wx - EVX_PMAXSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f383d RVM Vx Hx Wx - EVX_PMAXSD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f383d RVM Vx Hx Wx - EVX_PMAXSQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f383e RVM Vx Hx Wx - EVX_PMAXUW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f383f RVM Vx Hx Wx - EVX_PMAXUD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f383f RVM Vx Hx Wx - EVX_PMAXUQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f3820 RM Vx Wh - - EVX_PMOVSXBW+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.0f3821 RM Vx Wf - - EVX_PMOVSXBD+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.66.0f3822 RM Vx We - - EVX_PMOVSXBQ+k F=AVX512F TUPLE_EIGHTH_MEM -EVEX.66.0f3823 RM Vx Wh - - EVX_PMOVSXWD+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.0f3824 RM Vx Wf - - EVX_PMOVSXWQ+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.66.W0.0f3825 RM Vx Wh - - EVX_PMOVSXDQ+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.0f3830 RM Vx Wh - - EVX_PMOVZXBW+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.0f3831 RM Vx Wf - - EVX_PMOVZXBD+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.66.0f3832 RM Vx We - - EVX_PMOVZXBQ+k F=AVX512F TUPLE_EIGHTH_MEM -EVEX.66.0f3833 RM Vx Wh - - EVX_PMOVZXWD+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.0f3834 RM Vx Wf - - EVX_PMOVZXWQ+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.66.W0.0f3835 RM Vx Wh - - EVX_PMOVZXDQ+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.W1.0f3828 RVM Vx Hx Wx - EVX_PMULDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f380b RVM Vx Hx Wx - EVX_PMULHRSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fe4 RVM Vx Hx Wx - EVX_PMULHUW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fe5 RVM Vx Hx Wx - EVX_PMULHW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fd5 RVM Vx Hx Wx - EVX_PMULLW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3840 RVM Vx Hx Wx - EVX_PMULLD+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f3840 RVM Vx Hx Wx - EVX_PMULLQ+kb F=AVX512DQ TUPLE_FULL_64 -EVEX.66.W1.0ff4 RVM Vx Hx Wx - EVX_PMULUDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0feb RVM Vx Hx Wx - EVX_PORD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0feb RVM Vx Hx Wx - EVX_PORQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0ff6 RVM Vx Hx Wx - EVX_PSADBW F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f3800 RVM Vx Hx Wx - EVX_PSHUFB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f70 RMI Vx Wx Ib - EVX_PSHUFD+kb F=AVX512F TUPLE_FULL_32 -EVEX.F3.0f70 RMI Vx Wx Ib - EVX_PSHUFHW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F2.0f70 RMI Vx Wx Ib - EVX_PSHUFLW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f71/2 VMI Hx Wx Ib - EVX_PSRLW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f71/4 VMI Hx Wx Ib - EVX_PSRAW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f71/6 VMI Hx Wx Ib - EVX_PSLLW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f72/2 VMI Hx Wx Ib - EVX_PSRLD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W0.0f72/4 VMI Hx Wx Ib - EVX_PSRAD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W0.0f72/6 VMI Hx Wx Ib - EVX_PSLLD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f73/2 VMI Hx Wx Ib - EVX_PSRLQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.0f72/4 VMI Hx Wx Ib - EVX_PSRAQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.0f73/6 VMI Hx Wx Ib - EVX_PSLLQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0fd1 RVM Vx Hx Wdq - EVX_PSRLW+k F=AVX512BW TUPLE_MEM128 -EVEX.66.W0.0fd2 RVM Vx Hx Wdq - EVX_PSRLD+k F=AVX512F TUPLE_MEM128 -EVEX.66.W1.0fd3 RVM Vx Hx Wdq - EVX_PSRLQ+k F=AVX512F TUPLE_MEM128 -EVEX.66.0fe1 RVM Vx Hx Wdq - EVX_PSRAW+k F=AVX512BW TUPLE_MEM128 -EVEX.66.W0.0fe2 RVM Vx Hx Wdq - EVX_PSRAD+k F=AVX512F TUPLE_MEM128 -EVEX.66.W1.0fe2 RVM Vx Hx Wdq - EVX_PSRAQ+k F=AVX512F TUPLE_MEM128 -EVEX.66.0ff1 RVM Vx Hx Wdq - EVX_PSLLW+k F=AVX512BW TUPLE_MEM128 -EVEX.66.W0.0ff2 RVM Vx Hx Wdq - EVX_PSLLD+k F=AVX512F TUPLE_MEM128 -EVEX.66.W1.0ff3 RVM Vx Hx Wdq - EVX_PSLLQ+k F=AVX512F TUPLE_MEM128 -EVEX.66.0f73/3 VMI Hx Wx Ib - EVX_PSRLDQ F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f73/7 VMI Hx Wx Ib - EVX_PSLLDQ F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0ff8 RVM Vx Hx Wx - EVX_PSUBB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0ff9 RVM Vx Hx Wx - EVX_PSUBW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0ffa RVM Vx Hx Wx - EVX_PSUBD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0ffb RVM Vx Hx Wx - EVX_PSUBQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0fe8 RVM Vx Hx Wx - EVX_PSUBSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fe9 RVM Vx Hx Wx - EVX_PSUBSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fd8 RVM Vx Hx Wx - EVX_PSUBUSB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0fd9 RVM Vx Hx Wx - EVX_PSUBUSW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f60 RVM Vx Hx Wx - EVX_PUNPCKLBW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f61 RVM Vx Hx Wx - EVX_PUNPCKLWD+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f62 RVM Vx Hx Wx - EVX_PUNPCKLDQ+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f6c RVM Vx Hx Wx - EVX_PUNPCKLQDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.0f68 RVM Vx Hx Wx - EVX_PUNPCKHBW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.0f69 RVM Vx Hx Wx - EVX_PUNPCKHWD+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f6a RVM Vx Hx Wx - EVX_PUNPCKHDQ+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f6d RVM Vx Hx Wx - EVX_PUNPCKHQDQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0fef RVM Vx Hx Wx - EVX_PXORD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fef RVM Vx Hx Wx - EVX_PXORQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.NP.W0.0fc6 RVMI Vx Hx Wx Ib EVX_SHUFPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0fc6 RVMI Vx Hx Wx Ib EVX_SHUFPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.NP.W0.0f51 RM Vps Wps - - EVX_SQRTPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f51 RM Vpd Wpd - - EVX_SQRTPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f51 RVM Vdq Hdq Wss - EVX_SQRTSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f51 RVM Vdq Hdq Wsd - EVX_SQRTSD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.0f5c RVM Vps Hps Wps - EVX_SUBPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f5c RVM Vpd Hpd Wpd - EVX_SUBPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.LIG.0f5c RVM Vdq Hdq Wss - EVX_SUBSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.F2.W1.LIG.0f5c RVM Vdq Hdq Wsd - EVX_SUBSD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.NP.W0.LIG.0f2e RM Vss Wss - - EVX_UCOMISS+e F=AVX512F TUPLE1_SCALAR_32 EFL=0--0m0mm -EVEX.66.W1.LIG.0f2e RM Vsd Wsd - - EVX_UCOMISD+e F=AVX512F TUPLE1_SCALAR_64 EFL=0--0m0mm -EVEX.NP.W0.0f14 RVM Vps Hps Wps - EVX_UNPCKLPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f14 RVM Vpd Hpd Wpd - EVX_UNPCKLPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.NP.W0.0f15 RVM Vps Hps Wps - EVX_UNPCKHPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f15 RVM Vpd Hpd Wpd - EVX_UNPCKHPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a03 RVMI Vx Hx Wx Ib EVX_ALIGND+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a03 RVMI Vx Hx Wx Ib EVX_ALIGNQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3865 RVM Vx Hx Wx - EVX_BLENDMPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3865 RVM Vx Hx Wx - EVX_BLENDMPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3818 RM Vx Wd - - EVX_BROADCASTSS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W0.L12.0f3819 RM Vx Wq - - EVX_BROADCASTF32X2+k F=AVX512DQ TUPLE2_32 -EVEX.66.W1.L12.0f3819 RM Vx Wq - - EVX_BROADCASTSD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.L12.0f381a/m RM Vx Mdq - - EVX_BROADCASTF32X4+k F=AVX512F TUPLE4_32 -EVEX.66.W1.L12.0f381a/m RM Vx Mdq - - EVX_BROADCASTF64X2+k F=AVX512DQ TUPLE2_64 -EVEX.66.W0.L2.0f381b/m RM Vx Mqq - - EVX_BROADCASTF32X8+k F=AVX512DQ TUPLE8_32 -EVEX.66.W1.L2.0f381b/m RM Vx Mqq - - EVX_BROADCASTF64X4+k F=AVX512F TUPLE4_64 -# Note tuple type, scale is not memory size but element size -EVEX.66.W0.0f388a/m MR Md Vx - - EVX_COMPRESSPS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W0.0f388a/r MR Ux Vx - - EVX_COMPRESSPS+k F=AVX512F -EVEX.66.W1.0f388a/m MR Mq Vx - - EVX_COMPRESSPD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W1.0f388a/r MR Ux Vx - - EVX_COMPRESSPD+k F=AVX512F -EVEX.F2.W0.0f3872 RVM Vx Hx Wx - EVX_CVTNE2PS2BF16+kb F=AVX512_BF16 TUPLE_FULL_32 -EVEX.F3.W0.0f3872 RM Vh Wx - - EVX_CVTNEPS2BF16+kb F=AVX512_BF16 TUPLE_FULL_32 -EVEX.66.W0.0f7b RM Vx Wh - - EVX_CVTPS2QQ+kbr F=AVX512DQ TUPLE_HALF_32 -EVEX.66.W1.0f7b RM Vx Wx - - EVX_CVTPD2QQ+kbr F=AVX512DQ TUPLE_FULL_64 -EVEX.NP.W0.0f79 RM Vx Wx - - EVX_CVTPS2UDQ+kbr F=AVX512F TUPLE_FULL_32 -EVEX.NP.W1.0f79 RM Vh Wx - - EVX_CVTPD2UDQ+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f79 RM Vx Wh - - EVX_CVTPS2UQQ+kbr F=AVX512F TUPLE_HALF_32 -EVEX.66.W1.0f79 RM Vx Wx - - EVX_CVTPD2UQQ+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3813 RM Vx Wh - - EVX_CVTPH2PS+ke F=AVX512F TUPLE_HALF_MEM -EVEX.66.W0.0f3a1d MRI Wh Vx Ib - EVX_CVTPS2PH+ke F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W1.0fe6 RM Vx Wx - - EVX_CVTQQ2PD+kbr F=AVX512DQ TUPLE_FULL_64 -EVEX.NP.W1.0f5b RM Vh Wx - - EVX_CVTQQ2PS+kbr F=AVX512DQ TUPLE_FULL_64 -EVEX.F2.LIG.0f79 RM Gy Wsd - - EVX_CVTSD2USI+r F=AVX512F TUPLE1_FIXED_64 -EVEX.F3.LIG.0f79 RM Gy Wss - - EVX_CVTSS2USI+r F=AVX512F TUPLE1_FIXED_32 -# Note: for W0, ER is ignored (i.e., will not UD, according to Intel SDM) -EVEX.F2.LIG.0f7b RVM Vdq Hdq Ey - EVX_CVTUSI2SD+r F=AVX512F TUPLE1_SCALAR_OPSZ -EVEX.F3.LIG.0f7b RVM Vdq Hdq Ey - EVX_CVTUSI2SS+r F=AVX512F TUPLE1_SCALAR_OPSZ -EVEX.66.W0.0f7a RM Vx Wh - - EVX_CVTTPS2QQ+kbe F=AVX512DQ TUPLE_HALF_32 -EVEX.66.W1.0f7a RM Vx Wx - - EVX_CVTTPD2QQ+kbe F=AVX512DQ TUPLE_FULL_64 -EVEX.NP.W0.0f78 RM Vx Wx - - EVX_CVTTPS2UDQ+kbe F=AVX512F TUPLE_FULL_32 -EVEX.NP.W1.0f78 RM Vh Wx - - EVX_CVTTPD2UDQ+kbe F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f78 RM Vx Wh - - EVX_CVTTPS2UQQ+kbe F=AVX512F TUPLE_HALF_32 -EVEX.66.W1.0f78 RM Vx Wx - - EVX_CVTTPD2UQQ+kbe F=AVX512F TUPLE_FULL_64 -EVEX.F2.LIG.0f78 RM Gy Wsd - - EVX_CVTTSD2USI+e F=AVX512F TUPLE1_FIXED_64 -EVEX.F3.LIG.0f78 RM Gy Wss - - EVX_CVTTSS2USI+e F=AVX512F TUPLE1_FIXED_32 -# Note: SAE is ignored. -EVEX.F3.W0.0f7a RM Vx Wh - - EVX_CVTUDQ2PD+kbe F=AVX512F TUPLE_HALF_32 -EVEX.F2.W0.0f7a RM Vx Wx - - EVX_CVTUDQ2PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.F3.W1.0f7a RM Vx Wx - - EVX_CVTUQQ2PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.F2.W1.0f7a RM Vh Wx - - EVX_CVTUQQ2PS+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a42 RVMI Vx Hx Wx Ib EVX_DBPSADBW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F3.W0.0f3852 RVM Vx Hx Wx - EVX_DPBF16PS+kb F=AVX512_BF16 TUPLE_FULL_32 -# Note tuple type, scale is not memory size but element size -EVEX.66.W0.0f3888/m RM Vx Md - - EVX_EXPANDPS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W0.0f3888/r RM Vx Ux - - EVX_EXPANDPS+k F=AVX512F -EVEX.66.W1.0f3888/m RM Vx Mq - - EVX_EXPANDPD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W1.0f3888/r RM Vx Ux - - EVX_EXPANDPD+k F=AVX512F -EVEX.66.W0.L12.0f3a19 MRI Wdq Vx Ib - EVX_EXTRACTF32X4+k F=AVX512F TUPLE4_32 -EVEX.66.W1.L12.0f3a19 MRI Wdq Vx Ib - EVX_EXTRACTF64X2+k F=AVX512F TUPLE2_64 -EVEX.66.W0.L2.0f3a1b MRI Wqq Vx Ib - EVX_EXTRACTF32X8+k F=AVX512F TUPLE8_32 -EVEX.66.W1.L2.0f3a1b MRI Wqq Vx Ib - EVX_EXTRACTF64X4+k F=AVX512F TUPLE4_64 -EVEX.66.W0.L12.0f3a39 MRI Wdq Vx Ib - EVX_EXTRACTI32X4+k F=AVX512F TUPLE4_32 -EVEX.66.W1.L12.0f3a39 MRI Wdq Vx Ib - EVX_EXTRACTI64X2+k F=AVX512F TUPLE2_64 -EVEX.66.W0.L2.0f3a3b MRI Wqq Vx Ib - EVX_EXTRACTI32X8+k F=AVX512F TUPLE8_32 -EVEX.66.W1.L2.0f3a3b MRI Wqq Vx Ib - EVX_EXTRACTI64X4+k F=AVX512F TUPLE4_64 -EVEX.66.W0.0f3a54 RVMI Vps Hps Wps Ib EVX_FIXUPIMMPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a54 RVMI Vpd Hpd Wpd Ib EVX_FIXUPIMMPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a55 RVMI Vdq Hdq Wss Ib EVX_FIXUPIMMSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a55 RVMI Vdq Hdq Wsd Ib EVX_FIXUPIMMSD+ke F=AVX512F TUPLE1_SCALAR_64 -# TODO: verify these, this is just copied from AVX/FMA. -EVEX.66.W0.0f3896 RVM Vx Hx Wx - EVX_FMADDSUB132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3896 RVM Vx Hx Wx - EVX_FMADDSUB132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3897 RVM Vx Hx Wx - EVX_FMSUBADD132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3897 RVM Vx Hx Wx - EVX_FMSUBADD132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3898 RVM Vx Hx Wx - EVX_FMADD132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3898 RVM Vx Hx Wx - EVX_FMADD132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3899 RVM Vdq Hdq Wss - EVX_FMADD132SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3899 RVM Vdq Hdq Wsd - EVX_FMADD132SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f389a RVM Vx Hx Wx - EVX_FMSUB132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f389a RVM Vx Hx Wx - EVX_FMSUB132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f389b RVM Vdq Hdq Wss - EVX_FMSUB132SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f389b RVM Vdq Hdq Wsd - EVX_FMSUB132SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f389c RVM Vx Hx Wx - EVX_FNMADD132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f389c RVM Vx Hx Wx - EVX_FNMADD132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f389d RVM Vdq Hdq Wss - EVX_FNMADD132SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f389d RVM Vdq Hdq Wsd - EVX_FNMADD132SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f389e RVM Vx Hx Wx - EVX_FNMSUB132PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f389e RVM Vx Hx Wx - EVX_FNMSUB132PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f389f RVM Vdq Hdq Wss - EVX_FNMSUB132SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f389f RVM Vdq Hdq Wsd - EVX_FNMSUB132SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38a6 RVM Vx Hx Wx - EVX_FMADDSUB213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38a6 RVM Vx Hx Wx - EVX_FMADDSUB213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f38a7 RVM Vx Hx Wx - EVX_FMSUBADD213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38a7 RVM Vx Hx Wx - EVX_FMSUBADD213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f38a8 RVM Vx Hx Wx - EVX_FMADD213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38a8 RVM Vx Hx Wx - EVX_FMADD213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38a9 RVM Vdq Hdq Wss - EVX_FMADD213SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38a9 RVM Vdq Hdq Wsd - EVX_FMADD213SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38aa RVM Vx Hx Wx - EVX_FMSUB213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38aa RVM Vx Hx Wx - EVX_FMSUB213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38ab RVM Vdq Hdq Wss - EVX_FMSUB213SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38ab RVM Vdq Hdq Wsd - EVX_FMSUB213SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38ac RVM Vx Hx Wx - EVX_FNMADD213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38ac RVM Vx Hx Wx - EVX_FNMADD213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38ad RVM Vdq Hdq Wss - EVX_FNMADD213SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38ad RVM Vdq Hdq Wsd - EVX_FNMADD213SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38ae RVM Vx Hx Wx - EVX_FNMSUB213PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38ae RVM Vx Hx Wx - EVX_FNMSUB213PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38af RVM Vdq Hdq Wss - EVX_FNMSUB213SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38af RVM Vdq Hdq Wsd - EVX_FNMSUB213SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38b6 RVM Vx Hx Wx - EVX_FMADDSUB231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38b6 RVM Vx Hx Wx - EVX_FMADDSUB231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f38b7 RVM Vx Hx Wx - EVX_FMSUBADD231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38b7 RVM Vx Hx Wx - EVX_FMSUBADD231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f38b8 RVM Vx Hx Wx - EVX_FMADD231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38b8 RVM Vx Hx Wx - EVX_FMADD231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38b9 RVM Vdq Hdq Wss - EVX_FMADD231SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38b9 RVM Vdq Hdq Wsd - EVX_FMADD231SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38ba RVM Vx Hx Wx - EVX_FMSUB231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38ba RVM Vx Hx Wx - EVX_FMSUB231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38bb RVM Vdq Hdq Wss - EVX_FMSUB231SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38bb RVM Vdq Hdq Wsd - EVX_FMSUB231SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38bc RVM Vx Hx Wx - EVX_FNMADD231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38bc RVM Vx Hx Wx - EVX_FNMADD231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38bd RVM Vdq Hdq Wss - EVX_FNMADD231SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38bd RVM Vdq Hdq Wsd - EVX_FNMADD231SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38be RVM Vx Hx Wx - EVX_FNMSUB231PS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f38be RVM Vx Hx Wx - EVX_FNMSUB231PD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f38bf RVM Vdq Hdq Wss - EVX_FNMSUB231SS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f38bf RVM Vdq Hdq Wsd - EVX_FNMSUB231SD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f3a66 RMI Kb Wps Ib - EVX_FPCLASSPS+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f3a66 RMI Kb Wpd Ib - EVX_FPCLASSPD+kb F=AVX512DQ TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a67 RMI Kb Wss Ib - EVX_FPCLASSSS+k F=AVX512DQ TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a67 RMI Kb Wsd Ib - EVX_FPCLASSSD+k F=AVX512DQ TUPLE1_SCALAR_64 -EVEX.66.W0.0f3892/m RM Vx Md - - EVX_GATHERDPS+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f3892/m RM Vx Mq - - EVX_GATHERDPD+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f3893/m RM Vh Md - - EVX_GATHERQPS+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f3893/m RM Vx Mq - - EVX_GATHERQPD+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f3842 RM Vps Wps - - EVX_GETEXPPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3842 RM Vpd Wpd - - EVX_GETEXPPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3843 RVM Vdq Hdq Wss - EVX_GETEXPSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3843 RVM Vdq Hdq Wsd - EVX_GETEXPSD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f3a26 RMI Vps Wps Ib - EVX_GETMANTPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a26 RMI Vpd Wpd Ib - EVX_GETMANTPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a27 RVMI Vdq Hdq Wss Ib EVX_GETMANTSS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a27 RVMI Vdq Hdq Wsd Ib EVX_GETMANTSD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.L12.0f3a18 RVMI Vx Hx Wdq Ib EVX_INSERTF32X4+k F=AVX512F TUPLE4_32 -EVEX.66.W1.L12.0f3a18 RVMI Vx Hx Wdq Ib EVX_INSERTF64X2+k F=AVX512DQ TUPLE2_64 -EVEX.66.W0.L2.0f3a1a RVMI Vx Hx Wqq Ib EVX_INSERTF32X8+k F=AVX512DQ TUPLE8_32 -EVEX.66.W1.L2.0f3a1a RVMI Vx Hx Wqq Ib EVX_INSERTF64X4+k F=AVX512F TUPLE4_64 -EVEX.66.W0.L12.0f3a38 RVMI Vx Hx Wdq Ib EVX_INSERTI32X4+k F=AVX512F TUPLE4_32 -EVEX.66.W1.L12.0f3a38 RVMI Vx Hx Wdq Ib EVX_INSERTI64X2+k F=AVX512DQ TUPLE2_64 -EVEX.66.W0.L2.0f3a3a RVMI Vx Hx Wqq Ib EVX_INSERTI32X8+k F=AVX512DQ TUPLE8_32 -EVEX.66.W1.L2.0f3a3a RVMI Vx Hx Wqq Ib EVX_INSERTI64X4+k F=AVX512F TUPLE4_64 -EVEX.F2.W0.0f3868 RVM K Hx Wx - EVX_P2INTERSECTD+b F=AVX512_VP2INTERSECT TUPLE_FULL_32 -EVEX.F2.W1.0f3868 RVM K Hx Wx - EVX_P2INTERSECTQ+b F=AVX512_VP2INTERSECT TUPLE_FULL_64 -EVEX.66.W0.0f3866 RVM Vx Hx Wx - EVX_PBLENDMB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W1.0f3866 RVM Vx Hx Wx - EVX_PBLENDMW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3864 RVM Vx Hx Wx - EVX_PBLENDMD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3864 RVM Vx Hx Wx - EVX_PBLENDMQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f387a/r RM Vx Rb - - EVX_PBROADCAST+k F=AVX512BW -EVEX.66.W0.0f387b/r RM Vx Rw - - EVX_PBROADCAST+k F=AVX512BW -EVEX.66.W0.0f387c/r RM Vx Rd - - EVX_PBROADCAST+k F=AVX512F -EVEX.66.W1.0f387c/r RM Vx Rd - - EVX_PBROADCAST+k I64 F=AVX512F -EVEX.66.W1.0f387c/r RM Vx Rq - - EVX_PBROADCAST+k O64 F=AVX512F -EVEX.66.W0.0f3878 RM Vx Wb - - EVX_PBROADCASTB+k F=AVX512BW TUPLE1_SCALAR_8 -EVEX.66.W0.0f3879 RM Vx Ww - - EVX_PBROADCASTW+k F=AVX512BW TUPLE1_SCALAR_16 -EVEX.66.W0.0f3858 RM Vx Wd - - EVX_PBROADCASTD+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.0f3859 RM Vx Wq - - EVX_PBROADCASTQ+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f3859 RM Vx Wq - - EVX_BROADCASTI32X2+k F=AVX512DQ TUPLE2_32 -EVEX.66.W0.L12.0f385a/m RM Vx Mdq - - EVX_BROADCASTI32X4+k F=AVX512DQ TUPLE4_32 -EVEX.66.W1.L12.0f385a/m RM Vx Mdq - - EVX_BROADCASTI64X2+k F=AVX512DQ TUPLE2_64 -EVEX.66.W0.L2.0f385b/m RM Vx Mqq - - EVX_BROADCASTI32X8+k F=AVX512DQ TUPLE8_32 -EVEX.66.W1.L2.0f385b/m RM Vx Mqq - - EVX_BROADCASTI64X4+k F=AVX512F TUPLE4_64 -EVEX.F3.W1.0f382a/r RM Vx K - - EVX_PBROADCASTMB2Q F=AVX512CD -EVEX.F3.W0.0f383a/r RM Vx K - - EVX_PBROADCASTMW2D F=AVX512CD -EVEX.66.W0.0f3a1e RVMI K Hx Wx Ib EVX_PCMPUD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W0.0f3a1f RVMI K Hx Wx Ib EVX_PCMPD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a1e RVMI K Hx Wx Ib EVX_PCMPUQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.0f3a1f RVMI K Hx Wx Ib EVX_PCMPQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a3e RVMI K Hx Wx Ib EVX_PCMPUB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3a3f RVMI K Hx Wx Ib EVX_PCMPB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W1.0f3a3e RVMI K Hx Wx Ib EVX_PCMPUW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W1.0f3a3f RVMI K Hx Wx Ib EVX_PCMPW+k F=AVX512BW TUPLE_FULL_MEM -# Note tuple type, scale is not memory size but element size -EVEX.66.W0.0f3863/m MR Mb Vx - - EVX_PCOMPRESSB+k F=AVX512_VBMI2 TUPLE1_SCALAR_8 -EVEX.66.W0.0f3863/r MR Ux Vx - - EVX_PCOMPRESSB+k F=AVX512_VBMI2 -EVEX.66.W1.0f3863/m MR Mw Vx - - EVX_PCOMPRESSW+k F=AVX512_VBMI2 TUPLE1_SCALAR_16 -EVEX.66.W1.0f3863/r MR Ux Vx - - EVX_PCOMPRESSW+k F=AVX512_VBMI2 -EVEX.66.W0.0f388b/m MR Md Vx - - EVX_PCOMPRESSD+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W0.0f388b/r MR Ux Vx - - EVX_PCOMPRESSD+k F=AVX512F -EVEX.66.W1.0f388b/m MR Mq Vx - - EVX_PCOMPRESSQ+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W1.0f388b/r MR Ux Vx - - EVX_PCOMPRESSQ+k F=AVX512F -EVEX.66.W0.0f38c4 RM Vx Wx - - EVX_PCONFLICTD+kb F=AVX512CD TUPLE_FULL_32 -EVEX.66.W1.0f38c4 RM Vx Wx - - EVX_PCONFLICTQ+kb F=AVX512CD TUPLE_FULL_64 -EVEX.66.W0.0f3850 RVM Vx Hx Wx - EVX_PDPBUSD+kb F=AVX512_VNNI TUPLE_FULL_32 -EVEX.66.W0.0f3851 RVM Vx Hx Wx - EVX_PDPBUSDS+kb F=AVX512_VNNI TUPLE_FULL_32 -EVEX.66.W0.0f3852 RVM Vx Hx Wx - EVX_PDPWSSD+kb F=AVX512_VNNI TUPLE_FULL_32 -EVEX.66.W0.0f3853 RVM Vx Hx Wx - EVX_PDPWSSDS+kb F=AVX512_VNNI TUPLE_FULL_32 -EVEX.66.W0.0f388d RVM Vx Hx Wx - EVX_PERMB+k F=AVX512_VBMI TUPLE_FULL_MEM -EVEX.66.W1.0f388d RVM Vx Hx Wx - EVX_PERMW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.L12.0f3836 RVM Vx Hx Wx - EVX_PERMD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W0.0f3875 RVM Vx Hx Wx - EVX_PERMI2B+k F=AVX512_VBMI TUPLE_FULL_MEM -EVEX.66.W1.0f3875 RVM Vx Hx Wx - EVX_PERMI2W+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3876 RVM Vx Hx Wx - EVX_PERMI2D+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3876 RVM Vx Hx Wx - EVX_PERMI2Q+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3877 RVM Vx Hx Wx - EVX_PERMI2PS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3877 RVM Vx Hx Wx - EVX_PERMI2PD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f380c RVM Vx Hx Wx - EVX_PERMILPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f380d RVM Vx Hx Wx - EVX_PERMILPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a04 RMI Vx Wx Ib - EVX_PERMILPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a05 RMI Vx Wx Ib - EVX_PERMILPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.L12.0f3816 RVM Vx Hx Wx - EVX_PERMPS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.L12.0f3816 RVM Vx Hx Wx - EVX_PERMPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.L12.0f3836 RVM Vx Hx Wx - EVX_PERMQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.L12.0f3a00 RMI Vx Wx Ib - EVX_PERMQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.L12.0f3a01 RMI Vx Wx Ib - EVX_PERMPD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f387d RVM Vx Hx Wx - EVX_PERMT2B+k F=AVX512_VBMI TUPLE_FULL_MEM -EVEX.66.W1.0f387d RVM Vx Hx Wx - EVX_PERMT2W+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f387e RVM Vx Hx Wx - EVX_PERMT2D+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f387e RVM Vx Hx Wx - EVX_PERMT2Q+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f387f RVM Vx Hx Wx - EVX_PERMT2PS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f387f RVM Vx Hx Wx - EVX_PERMT2PD+kb F=AVX512F TUPLE_FULL_64 -# Note tuple type, scale is not memory size but element size -EVEX.66.W0.0f3862/m RM Vx Mb - - EVX_PEXPANDB+k F=AVX512_VBMI2 TUPLE1_SCALAR_8 -EVEX.66.W0.0f3862/r RM Vx Ux - - EVX_PEXPANDB+k F=AVX512_VBMI2 -EVEX.66.W1.0f3862/m RM Vx Mw - - EVX_PEXPANDW+k F=AVX512_VBMI2 TUPLE1_SCALAR_16 -EVEX.66.W1.0f3862/r RM Vx Ux - - EVX_PEXPANDW+k F=AVX512_VBMI2 -EVEX.66.W0.0f3889/m RM Vx Md - - EVX_PEXPANDD+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W0.0f3889/r RM Vx Ux - - EVX_PEXPANDD+k F=AVX512F -EVEX.66.W1.0f3889/m RM Vx Mq - - EVX_PEXPANDQ+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W1.0f3889/r RM Vx Ux - - EVX_PEXPANDQ+k F=AVX512F -EVEX.66.W0.0f3890/m RM Vx Md - - EVX_PGATHERDD+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f3890/m RM Vx Mq - - EVX_PGATHERDQ+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f3891/m RM Vh Md - - EVX_PGATHERQD+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f3891/m RM Vx Mq - - EVX_PGATHERQQ+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f3844 RM Vx Wx - - EVX_PLZCNTD+kb F=AVX512CD TUPLE_FULL_32 -EVEX.66.W1.0f3844 RM Vx Wx - - EVX_PLZCNTQ+kb F=AVX512CD TUPLE_FULL_64 -EVEX.66.W1.0f38b4 RVM Vx Hx Wx - EVX_PMADD52LUQ+kb F=AVX512_IFMA TUPLE_FULL_64 -EVEX.66.W1.0f38b5 RVM Vx Hx Wx - EVX_PMADD52HUQ+kb F=AVX512_IFMA TUPLE_FULL_64 -EVEX.F3.W0.0f3829/r RM K Ux - - EVX_PMOVB2M F=AVX512BW -EVEX.F3.W1.0f3829/r RM K Ux - - EVX_PMOVW2M F=AVX512BW -EVEX.F3.W0.0f3839/r RM K Ux - - EVX_PMOVD2M F=AVX512DQ -EVEX.F3.W1.0f3839/r RM K Ux - - EVX_PMOVQ2M F=AVX512DQ -EVEX.F3.W0.0f3828/r RM Vx K - - EVX_PMOVM2B F=AVX512BW -EVEX.F3.W1.0f3828/r RM Vx K - - EVX_PMOVM2W F=AVX512BW -EVEX.F3.W0.0f3838/r RM Vx K - - EVX_PMOVM2D F=AVX512DQ -EVEX.F3.W1.0f3838/r RM Vx K - - EVX_PMOVM2Q F=AVX512DQ -EVEX.F3.W0.0f3830 MR Wh Vx - - EVX_PMOVWB+k F=AVX512BW TUPLE_HALF_MEM -EVEX.F3.W0.0f3820 MR Wh Vx - - EVX_PMOVSWB+k F=AVX512BW TUPLE_HALF_MEM -EVEX.F3.W0.0f3810 MR Wh Vx - - EVX_PMOVUSWB+k F=AVX512BW TUPLE_HALF_MEM -EVEX.F3.W0.0f3831 MR Wf Vx - - EVX_PMOVDB+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3821 MR Wf Vx - - EVX_PMOVSDB+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3811 MR Wf Vx - - EVX_PMOVUSDB+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3832 MR We Vx - - EVX_PMOVQB+k F=AVX512F TUPLE_EIGHTH_MEM -EVEX.F3.W0.0f3822 MR We Vx - - EVX_PMOVSQB+k F=AVX512F TUPLE_EIGHTH_MEM -EVEX.F3.W0.0f3812 MR We Vx - - EVX_PMOVUSQB+k F=AVX512F TUPLE_EIGHTH_MEM -EVEX.F3.W0.0f3833 MR Wh Vx - - EVX_PMOVDW+k F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W0.0f3823 MR Wh Vx - - EVX_PMOVSDW+k F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W0.0f3813 MR Wh Vx - - EVX_PMOVUSDW+k F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W0.0f3834 MR Wf Vx - - EVX_PMOVQW+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3824 MR Wf Vx - - EVX_PMOVSQW+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3814 MR Wf Vx - - EVX_PMOVUSQW+k F=AVX512F TUPLE_QUARTER_MEM -EVEX.F3.W0.0f3835 MR Wh Vx - - EVX_PMOVQD+k F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W0.0f3825 MR Wh Vx - - EVX_PMOVSQD+k F=AVX512F TUPLE_HALF_MEM -EVEX.F3.W0.0f3815 MR Wh Vx - - EVX_PMOVUSQD+k F=AVX512F TUPLE_HALF_MEM -EVEX.66.W1.0f3883 RVM Vx Hx Wx - EVX_PMULTISHIFTQB+kb F=AVX512_VBMI TUPLE_FULL_64 -EVEX.66.W0.0f3854 RM Vx Wx - - EVX_POPCNTB+k F=AVX512_BITALG TUPLE_FULL_MEM -EVEX.66.W1.0f3854 RM Vx Wx - - EVX_POPCNTW+k F=AVX512_BITALG TUPLE_FULL_MEM -EVEX.66.W0.0f3855 RM Vx Wx - - EVX_POPCNTD+kb F=AVX512_VPOPCNTDQ TUPLE_FULL_32 -EVEX.66.W1.0f3855 RM Vx Wx - - EVX_POPCNTQ+kb F=AVX512_VPOPCNTDQ TUPLE_FULL_64 -EVEX.66.W0.0f3814 RVM Vx Hx Wx - EVX_PRORVD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3814 RVM Vx Hx Wx - EVX_PRORVQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f72/0 VMI Hx Wx Ib - EVX_PRORD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f72/0 VMI Hx Wx Ib - EVX_PRORQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3815 RVM Vx Hx Wx - EVX_PROLVD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3815 RVM Vx Hx Wx - EVX_PROLVQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f72/1 VMI Hx Wx Ib - EVX_PROLD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f72/1 VMI Hx Wx Ib - EVX_PROLQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f38a0/m MR Md Vx - - EVX_PSCATTERDD+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f38a0/m MR Mq Vx - - EVX_PSCATTERDQ+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f38a1/m MR Md Vh - - EVX_PSCATTERQD+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f38a1/m MR Mq Vx - - EVX_PSCATTERQQ+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W1.0f3a70 RVMI Vx Hx Wx Ib EVX_PSHLDW+k F=AVX512_VBMI2 TUPLE_FULL_MEM -EVEX.66.W0.0f3a71 RVMI Vx Hx Wx Ib EVX_PSHLDD+kb F=AVX512_VBMI2 TUPLE_FULL_32 -EVEX.66.W1.0f3a71 RVMI Vx Hx Wx Ib EVX_PSHLDQ+kb F=AVX512_VBMI2 TUPLE_FULL_64 -EVEX.66.W1.0f3870 RVM Vx Hx Wx - EVX_PSHLDVW+k F=AVX512_VBMI2 TUPLE_FULL_MEM -EVEX.66.W0.0f3871 RVM Vx Hx Wx - EVX_PSHLDVD+kb F=AVX512_VBMI2 TUPLE_FULL_32 -EVEX.66.W1.0f3871 RVM Vx Hx Wx - EVX_PSHLDVQ+kb F=AVX512_VBMI2 TUPLE_FULL_64 -EVEX.66.W1.0f3a72 RVMI Vx Hx Wx Ib EVX_PSHRDW+k F=AVX512_VBMI2 TUPLE_FULL_MEM -EVEX.66.W0.0f3a73 RVMI Vx Hx Wx Ib EVX_PSHRDD+kb F=AVX512_VBMI2 TUPLE_FULL_32 -EVEX.66.W1.0f3a73 RVMI Vx Hx Wx Ib EVX_PSHRDQ+kb F=AVX512_VBMI2 TUPLE_FULL_64 -EVEX.66.W1.0f3872 RVM Vx Hx Wx - EVX_PSHRDVW+k F=AVX512_VBMI2 TUPLE_FULL_MEM -EVEX.66.W0.0f3873 RVM Vx Hx Wx - EVX_PSHRDVD+kb F=AVX512_VBMI2 TUPLE_FULL_32 -EVEX.66.W1.0f3873 RVM Vx Hx Wx - EVX_PSHRDVQ+kb F=AVX512_VBMI2 TUPLE_FULL_64 -EVEX.66.W0.0f388f RVM K Hx Wx - EVX_PSHUFBITQMB+k F=AVX512_BITALG TUPLE_FULL_MEM -EVEX.66.W1.0f3812 RVM Vx Hx Wx - EVX_PSLLVW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3847 RVM Vx Hx Wx - EVX_PSLLVD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3847 RVM Vx Hx Wx - EVX_PSLLVQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.0f3811 RVM Vx Hx Wx - EVX_PSRAVW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3846 RVM Vx Hx Wx - EVX_PSRAVD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3846 RVM Vx Hx Wx - EVX_PSRAVQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W1.0f3810 RVM Vx Hx Wx - EVX_PSRLVW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3845 RVM Vx Hx Wx - EVX_PSRLVD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3845 RVM Vx Hx Wx - EVX_PSRLVQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a25 RVMI Vx Hx Wx Ib EVX_PTERNLOGD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a25 RVMI Vx Hx Wx Ib EVX_PTERNLOGQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3826 RVM K Hx Wx - EVX_PTESTMB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W1.0f3826 RVM K Hx Wx - EVX_PTESTMW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.66.W0.0f3827 RVM K Hx Wx - EVX_PTESTMD+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3827 RVM K Hx Wx - EVX_PTESTMQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.F3.W0.0f3826 RVM K Hx Wx - EVX_PTESTNMB+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F3.W1.0f3826 RVM K Hx Wx - EVX_PTESTNMW+k F=AVX512BW TUPLE_FULL_MEM -EVEX.F3.W0.0f3827 RVM K Hx Wx - EVX_PTESTNMD+kb F=AVX512F TUPLE_FULL_32 -EVEX.F3.W1.0f3827 RVM K Hx Wx - EVX_PTESTNMQ+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.0f3a50 RVMI Vps Hps Wps Ib EVX_RANGEPS+kbe F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f3a50 RVMI Vpd Hpd Wpd Ib EVX_RANGEPD+kbe F=AVX512DQ TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a51 RVMI Vdq Hdq Wss Ib EVX_RANGESS+ke F=AVX512DQ TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a51 RVMI Vdq Hdq Wsd Ib EVX_RANGESD+ke F=AVX512DQ TUPLE1_SCALAR_64 -EVEX.66.W0.0f384c RM Vps Wps - - EVX_RCP14PS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f384c RM Vpd Wpd - - EVX_RCP14PD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f384d RVM Vdq Hdq Wss - EVX_RCP14SS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f384d RVM Vdq Hdq Wsd - EVX_RCP14SD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f3a56 RMI Vps Wps Ib - EVX_REDUCEPS+kbe F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f3a56 RMI Vpd Wpd Ib - EVX_REDUCEPD+kbe F=AVX512DQ TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a57 RVMI Vdq Hdq Wss Ib EVX_REDUCESS+ke F=AVX512DQ TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a57 RVMI Vdq Hdq Wsd Ib EVX_REDUCESD+ke F=AVX512DQ TUPLE1_SCALAR_64 -EVEX.66.W0.0f3a08 RMI Vps Wps Ib - EVX_RNDSCALEPS+kbe F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f3a09 RMI Vpd Wpd Ib - EVX_RNDSCALEPD+kbe F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f3a0a RVMI Vdq Hdq Wss Ib EVX_RNDSCALESS+ke F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f3a0b RVMI Vdq Hdq Wsd Ib EVX_RNDSCALESD+ke F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f384e RM Vps Wps - - EVX_RSQRT14PS+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f384e RM Vpd Wpd - - EVX_RSQRT14PD+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f384f RVM Vdq Hdq Wss - EVX_RSQRT14SS+k F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f384f RVM Vdq Hdq Wsd - EVX_RSQRT14SD+k F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f382c RVM Vps Hps Wps - EVX_SCALEFPS+kbr F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.0f382c RVM Vpd Hpd Wpd - EVX_SCALEFPD+kbr F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.LIG.0f382d RVM Vdq Hdq Wss - EVX_SCALEFSS+kr F=AVX512F TUPLE1_SCALAR_32 -EVEX.66.W1.LIG.0f382d RVM Vdq Hdq Wsd - EVX_SCALEFSD+kr F=AVX512F TUPLE1_SCALAR_64 -EVEX.66.W0.0f38a2/m MR Md Vx - - EVX_SCATTERDPS+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f38a2/m MR Mq Vx - - EVX_SCATTERDPD+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.0f38a3/m MR Md Vh - - EVX_SCATTERQPS+k F=AVX512F VSIB TUPLE1_SCALAR_32 -EVEX.66.W1.0f38a3/m MR Mq Vx - - EVX_SCATTERQPD+k F=AVX512F VSIB TUPLE1_SCALAR_64 -EVEX.66.W0.L12.0f3a23 RVMI Vps Hps Wps Ib EVX_SHUFF32X4+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.L12.0f3a23 RVMI Vpd Hpd Wpd Ib EVX_SHUFF64X2+kb F=AVX512F TUPLE_FULL_64 -EVEX.66.W0.L12.0f3a43 RVMI Vx Hx Wx Ib EVX_SHUFI32X4+kb F=AVX512F TUPLE_FULL_32 -EVEX.66.W1.L12.0f3a43 RVMI Vx Hx Wx Ib EVX_SHUFI64X2+kb F=AVX512F TUPLE_FULL_64 -EVEX.NP.W0.0f57 RVM Vps Hps Wps - EVX_XORPS+kb F=AVX512DQ TUPLE_FULL_32 -EVEX.66.W1.0f57 RVM Vpd Hpd Wpd - EVX_XORPD+kb F=AVX512DQ TUPLE_FULL_64 - - -# AVX512 Mask instructions -VEX.66.W0.L1.0f41/r RVM Kb Kb Kb - KANDB F=AVX512DQ -VEX.NP.W0.L1.0f41/r RVM Kw Kw Kw - KANDW F=AVX512F -VEX.66.W1.L1.0f41/r RVM Kd Kd Kd - KANDD F=AVX512BW -VEX.NP.W1.L1.0f41/r RVM Kq Kq Kq - KANDQ F=AVX512BW -VEX.66.W0.L1.0f42/r RVM Kb Kb Kb - KANDNB F=AVX512DQ -VEX.NP.W0.L1.0f42/r RVM Kw Kw Kw - KANDNW F=AVX512F -VEX.66.W1.L1.0f42/r RVM Kd Kd Kd - KANDND F=AVX512BW -VEX.NP.W1.L1.0f42/r RVM Kq Kq Kq - KANDNQ F=AVX512BW -VEX.66.W0.L0.0f44/r RM Kb Kb - - KNOTB F=AVX512DQ -VEX.NP.W0.L0.0f44/r RM Kw Kw - - KNOTW F=AVX512F -VEX.66.W1.L0.0f44/r RM Kd Kd - - KNOTD F=AVX512BW -VEX.NP.W1.L0.0f44/r RM Kq Kq - - KNOTQ F=AVX512BW -VEX.66.W0.L1.0f45/r RVM Kb Kb Kb - KORB F=AVX512DQ -VEX.NP.W0.L1.0f45/r RVM Kw Kw Kw - KORW F=AVX512F -VEX.66.W1.L1.0f45/r RVM Kd Kd Kd - KORD F=AVX512BW -VEX.NP.W1.L1.0f45/r RVM Kq Kq Kq - KORQ F=AVX512BW -VEX.66.W0.L1.0f46/r RVM Kb Kb Kb - KXNORB F=AVX512DQ -VEX.NP.W0.L1.0f46/r RVM Kw Kw Kw - KXNORW F=AVX512F -VEX.66.W1.L1.0f46/r RVM Kd Kd Kd - KXNORD F=AVX512BW -VEX.NP.W1.L1.0f46/r RVM Kq Kq Kq - KXNORQ F=AVX512BW -VEX.66.W0.L1.0f47/r RVM Kb Kb Kb - KXORB F=AVX512DQ -VEX.NP.W0.L1.0f47/r RVM Kw Kw Kw - KXORW F=AVX512F -VEX.66.W1.L1.0f47/r RVM Kd Kd Kd - KXORD F=AVX512BW -VEX.NP.W1.L1.0f47/r RVM Kq Kq Kq - KXORQ F=AVX512BW -VEX.66.W0.L1.0f4a/r RVM Kb Kb Kb - KADDB F=AVX512DQ -VEX.NP.W0.L1.0f4a/r RVM Kw Kw Kw - KADDW F=AVX512DQ -VEX.66.W1.L1.0f4a/r RVM Kd Kd Kd - KADDD F=AVX512BW -VEX.NP.W1.L1.0f4a/r RVM Kq Kq Kq - KADDQ F=AVX512BW -VEX.66.W0.L1.0f4b/r RVM Kw Kb Kb - KUNPCKBW F=AVX512F -VEX.NP.W0.L1.0f4b/r RVM Kd Kw Kw - KUNPCKWD F=AVX512BW -VEX.NP.W1.L1.0f4b/r RVM Kq Kd Kd - KUNPCKDQ F=AVX512BW -VEX.66.W0.L0.0f98/r RM Kb Kb - - KORTESTB F=AVX512DQ EFL=0--0m00m -VEX.NP.W0.L0.0f98/r RM Kw Kw - - KORTESTW F=AVX512F EFL=0--0m00m -VEX.66.W1.L0.0f98/r RM Kd Kd - - KORTESTD F=AVX512BW EFL=0--0m00m -VEX.NP.W1.L0.0f98/r RM Kq Kq - - KORTESTQ F=AVX512BW EFL=0--0m00m -VEX.66.W0.L0.0f90 RM Kb Kb - - KMOVB F=AVX512DQ -VEX.NP.W0.L0.0f90 RM Kw Kw - - KMOVW F=AVX512F -VEX.66.W1.L0.0f90 RM Kd Kd - - KMOVD F=AVX512BW -VEX.NP.W1.L0.0f90 RM Kq Kq - - KMOVQ F=AVX512BW -VEX.66.W0.L0.0f91/m MR Mb Kb - - KMOVB F=AVX512DQ -VEX.NP.W0.L0.0f91/m MR Mw Kw - - KMOVW F=AVX512F -VEX.66.W1.L0.0f91/m MR Md Kd - - KMOVD F=AVX512BW -VEX.NP.W1.L0.0f91/m MR Mq Kq - - KMOVQ F=AVX512BW -VEX.66.W0.L0.0f92/r RM Kb Rd - - KMOVB F=AVX512DQ -VEX.NP.W0.L0.0f92/r RM Kw Rd - - KMOVW F=AVX512F -VEX.F2.W0.L0.0f92/r RM Kd Rd - - KMOVD F=AVX512BW -VEX.F2.W1.L0.0f92/r RM Kq Rq - - KMOVQ O64 F=AVX512BW -VEX.66.W0.L0.0f93/r RM Gd Kb - - KMOVB F=AVX512DQ -VEX.NP.W0.L0.0f93/r RM Gd Kw - - KMOVW F=AVX512F -VEX.F2.W0.L0.0f93/r RM Gd Kd - - KMOVD F=AVX512BW -VEX.F2.W1.L0.0f93/r RM Gq Kq - - KMOVQ O64 F=AVX512BW -VEX.66.W0.L0.0f99/r RM Kb Kb - - KTESTB F=AVX512DQ EFL=0--0m00m -VEX.NP.W0.L0.0f99/r RM Kw Kw - - KTESTW F=AVX512DQ EFL=0--0m00m -VEX.66.W1.L0.0f99/r RM Kd Kd - - KTESTD F=AVX512BW EFL=0--0m00m -VEX.NP.W1.L0.0f99/r RM Kq Kq - - KTESTQ F=AVX512BW EFL=0--0m00m -VEX.66.W0.L0.0f3a30/r RMI Kb Kb Ib - KSHIFTRB F=AVX512DQ -VEX.66.W1.L0.0f3a30/r RMI Kw Kw Ib - KSHIFTRW F=AVX512F -VEX.66.W0.L0.0f3a31/r RMI Kd Kd Ib - KSHIFTRD F=AVX512BW -VEX.66.W1.L0.0f3a31/r RMI Kq Kq Ib - KSHIFTRQ F=AVX512BW -VEX.66.W0.L0.0f3a32/r RMI Kb Kb Ib - KSHIFTLB F=AVX512DQ -VEX.66.W1.L0.0f3a32/r RMI Kw Kw Ib - KSHIFTLW F=AVX512F -VEX.66.W0.L0.0f3a33/r RMI Kd Kd Ib - KSHIFTLD F=AVX512BW -VEX.66.W1.L0.0f3a33/r RMI Kq Kq Ib - KSHIFTLQ F=AVX512BW - -# AVX512-FP16 -EVEX.NP.W0.0f3a08 RMI Vx Wx Ib - EVX_RNDSCALEPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.NP.W0.LIG.0f3a0a RVMI Vdq Hdq Ww Ib EVX_RNDSCALESH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.0f3a26 RMI Vx Wx Ib - EVX_GETMANTPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.NP.W0.LIG.0f3a27 RVMI Vdq Hdq Ww Ib EVX_GETMANTSH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.0f3a56 RMI Vx Wx Ib - EVX_REDUCEPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.NP.W0.LIG.0f3a57 RVMI Vdq Hdq Ww Ib EVX_REDUCESH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.0f3a66 RMI K Wx Ib - EVX_FPCLASSPH+kb F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.NP.W0.LIG.0f3a67 RMI Kb Ww Ib - EVX_FPCLASSSH+k F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.0f3ac2 RVMI K Hx Wx Ib EVX_CMPPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.0f3ac2 RVMI Kb Hw Ww Ib EVX_CMPSH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 - -EVEX.F3.W0.LIG.M5.10/m RM Vdq Mw - - EVX_MOVSH+k F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.F3.W0.LIG.M5.10/r RVM Vdq Hdq Uw - EVX_MOVSH+k F=AVX512-FP16 -EVEX.F3.W0.LIG.M5.11/m MR Mw Vw - - EVX_MOVSH+k F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.F3.W0.LIG.M5.11/r MVR Udq Hdq Vw - EVX_MOVSH+k F=AVX512-FP16 -EVEX.NP.W0.LIG.M5.1d RVM Vdq Hdq Wd - EVX_CVTSS2SH+kr F=AVX512-FP16 TUPLE1_SCALAR_32 -EVEX.66.W0.M5.1d RM Vh Wx - - EVX_CVTPS2PHX+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F3.LIG.M5.2a RVM Vdq Hdq Ey - EVX_CVTSI2SH+r F=AVX512-FP16 TUPLE1_SCALAR_OPSZ -EVEX.F3.LIG.M5.2c RM Gy Ww - - EVX_CVTTSH2SI+e F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.F3.LIG.M5.2d RM Gy Ww - - EVX_CVTSH2SI+r F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.LIG.M5.2e RM Vw Ww - - EVX_UCOMISH+e F=AVX512-FP16 TUPLE1_SCALAR_16 EFL=0--0m0mm -EVEX.NP.W0.LIG.M5.2f RM Vw Ww - - EVX_COMISH+e F=AVX512-FP16 TUPLE1_SCALAR_16 EFL=0--0m0mm -EVEX.NP.W0.M5.51 RM Vx Wx - - EVX_SQRTPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.51 RVM Vdq Hdq Ww - EVX_SQRTSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.58 RVM Vx Hx Wx - EVX_ADDPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.58 RVM Vdq Hdq Ww - EVX_ADDSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.59 RVM Vx Hx Wx - EVX_MULPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.59 RVM Vdq Hdq Ww - EVX_MULSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.5a RM Vx Wf - - EVX_CVTPH2PD+kbe F=AVX512-FP16 TUPLE_QUARTER_16 BCST16 -EVEX.66.W1.M5.5a RM Vf Wx - - EVX_CVTPD2PH+kbr F=AVX512-FP16 TUPLE_FULL_64 -EVEX.F3.W0.LIG.M5.5a RVM Vdq Hdq Ww - EVX_CVTSH2SD+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.F2.W1.LIG.M5.5a RVM Vdq Hdq Wq - EVX_CVTSD2SH+kr F=AVX512-FP16 TUPLE1_SCALAR_64 -EVEX.NP.W0.M5.5b RM Vh Wx - - EVX_CVTDQ2PH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.NP.W1.M5.5b RM Vf Wx - - EVX_CVTQQ2PH+kbr F=AVX512-FP16 TUPLE_FULL_64 -EVEX.66.W0.M5.5b RM Vx Wh - - EVX_CVTPH2DQ+kbr F=AVX512-FP16 TUPLE_HALF_16 BCST16 -EVEX.F3.W0.M5.5b RM Vx Wh - - EVX_CVTTPH2DQ+kbe F=AVX512-FP16 TUPLE_HALF_16 BCST16 -EVEX.NP.W0.M5.5c RVM Vx Hx Wx - EVX_SUBPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.5c RVM Vdq Hdq Ww - EVX_SUBSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.5d RVM Vx Hx Wx - EVX_MINPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.5d RVM Vdq Hdq Ww - EVX_MINSH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.5e RVM Vx Hx Wx - EVX_DIVPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.5e RVM Vdq Hdq Ww - EVX_DIVSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.5f RVM Vx Hx Wx - EVX_MAXPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.LIG.M5.5f RVM Vdq Hdq Ww - EVX_MAXSH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.L0.M5.6e RM Vdq Ew - - EVX_MOVW_G2X F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.78 RM Vx Wh - - EVX_CVTTPH2UDQ+kbe F=AVX512-FP16 TUPLE_HALF_16 BCST16 -EVEX.66.W0.M5.78 RM Vx Wf - - EVX_CVTTPH2UQQ+kbe F=AVX512-FP16 TUPLE_QUARTER_16 BCST16 -EVEX.F3.LIG.M5.78 RM Gy Ww - - EVX_CVTTSH2USI+e F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.NP.W0.M5.79 RM Vx Wh - - EVX_CVTPH2UDQ+kbr F=AVX512-FP16 TUPLE_HALF_16 BCST16 -EVEX.66.W0.M5.79 RM Vx Wf - - EVX_CVTPH2UQQ+kbr F=AVX512-FP16 TUPLE_QUARTER_16 BCST16 -EVEX.F3.LIG.M5.79 RM Gy Ww - - EVX_CVTSH2USI+r F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M5.7a RM Vx Wf - - EVX_CVTTPH2QQ+kbe F=AVX512-FP16 TUPLE_QUARTER_16 BCST16 -EVEX.F2.W0.M5.7a RM Vh Wx - - EVX_CVTUDQ2PH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F2.W1.M5.7a RM Vf Wx - - EVX_CVTUQQ2PH+kbr F=AVX512-FP16 TUPLE_FULL_64 -EVEX.66.W0.M5.7b RM Vx Wf - - EVX_CVTPH2QQ+kbr F=AVX512-FP16 TUPLE_QUARTER_16 BCST16 -EVEX.F3.LIG.M5.7b RVM Vdq Hdq Ey - EVX_CVTUSI2SH+r F=AVX512-FP16 TUPLE1_SCALAR_OPSZ -EVEX.NP.W0.M5.7c RM Vx Wx - - EVX_CVTTPH2UW+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M5.7c RM Vx Wx - - EVX_CVTTPH2W+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.NP.W0.M5.7d RM Vx Wx - - EVX_CVTPH2UW+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M5.7d RM Vx Wx - - EVX_CVTPH2W+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F3.W0.M5.7d RM Vx Wx - - EVX_CVTW2PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.F2.W0.M5.7d RM Vx Wx - - EVX_CVTUW2PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.L0.M5.7e MR Ew Vw - - EVX_MOVW_X2G F=AVX512-FP16 TUPLE1_SCALAR_16 - -EVEX.66.W0.M6.13 RM Vx Wh - - EVX_CVTPH2PSX+kbe F=AVX512-FP16 TUPLE_HALF_16 BCST16 -EVEX.NP.W0.LIG.M6.13 RVM Vdq Hdq Ww - EVX_CVTSH2SS+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.2c RVM Vx Hx Wx - EVX_SCALEFPH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.2d RVM Vdq Hdq Ww - EVX_SCALEFSH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.42 RM Vx Wx - - EVX_GETEXPPH+kbe F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.43 RVM Vdq Hdq Ww - EVX_GETEXPSH+ke F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.4c RM Vx Wx - - EVX_RCPPH+kb F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.4d RVM Vdq Hdq Ww - EVX_RCPSH+k F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.4e RM Vx Wx - - EVX_RSQRTPH+kb F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.4f RVM Vdq Hdq Ww - EVX_RSQRTSH+k F=AVX512-FP16 TUPLE1_SCALAR_16 - -# TODO: for F{,C}M{ADD,UL}C{P,S}H, destreg must be unequal to the source registers -EVEX.F3.W0.M6.56 RVM Vx Hx Wx - EVX_FMADDCPH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F2.W0.M6.56 RVM Vx Hx Wx - EVX_FCMADDCPH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F3.W0.LIG.M6.57 RVM Vdq Hdq Wd - EVX_FMADDCSH+kr F=AVX512-FP16 TUPLE1_SCALAR_32 -EVEX.F2.W0.LIG.M6.57 RVM Vdq Hdq Wd - EVX_FCMADDCSH+kr F=AVX512-FP16 TUPLE1_SCALAR_32 -EVEX.F3.W0.M6.d6 RVM Vx Hx Wx - EVX_FMULCPH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F2.W0.M6.d6 RVM Vx Hx Wx - EVX_FCMULCPH+kbr F=AVX512-FP16 TUPLE_FULL_32 -EVEX.F3.W0.LIG.M6.d7 RVM Vdq Hdq Wd - EVX_FMULCSH+kr F=AVX512-FP16 TUPLE1_SCALAR_32 -EVEX.F2.W0.LIG.M6.d7 RVM Vdq Hdq Wd - EVX_FCMULCSH+kr F=AVX512-FP16 TUPLE1_SCALAR_32 - -EVEX.66.W0.M6.96 RVM Vx Hx Wx - EVX_FMADDSUB132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.a6 RVM Vx Hx Wx - EVX_FMADDSUB213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.b6 RVM Vx Hx Wx - EVX_FMADDSUB231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.97 RVM Vx Hx Wx - EVX_FMSUBADD132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.a7 RVM Vx Hx Wx - EVX_FMSUBADD213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.b7 RVM Vx Hx Wx - EVX_FMSUBADD231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.98 RVM Vx Hx Wx - EVX_FMADD132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.a8 RVM Vx Hx Wx - EVX_FMADD213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.b8 RVM Vx Hx Wx - EVX_FMADD231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.99 RVM Vdq Hdq Ww - EVX_FMADD132SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.a9 RVM Vdq Hdq Ww - EVX_FMADD213SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.b9 RVM Vdq Hdq Ww - EVX_FMADD231SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.9a RVM Vx Hx Wx - EVX_FMSUB132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.aa RVM Vx Hx Wx - EVX_FMSUB213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.ba RVM Vx Hx Wx - EVX_FMSUB231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.9b RVM Vdq Hdq Ww - EVX_FMSUB132SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.ab RVM Vdq Hdq Ww - EVX_FMSUB213SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.bb RVM Vdq Hdq Ww - EVX_FMSUB231SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.9c RVM Vx Hx Wx - EVX_FNMADD132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.ac RVM Vx Hx Wx - EVX_FNMADD213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.bc RVM Vx Hx Wx - EVX_FNMADD231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.9d RVM Vdq Hdq Ww - EVX_FNMADD132SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.ad RVM Vdq Hdq Ww - EVX_FNMADD213SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.bd RVM Vdq Hdq Ww - EVX_FNMADD231SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.M6.9e RVM Vx Hx Wx - EVX_FNMSUB132PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.ae RVM Vx Hx Wx - EVX_FNMSUB213PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.M6.be RVM Vx Hx Wx - EVX_FNMSUB231PH+kbr F=AVX512-FP16 TUPLE_FULL_16 BCST16 -EVEX.66.W0.LIG.M6.9f RVM Vdq Hdq Ww - EVX_FNMSUB132SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.af RVM Vdq Hdq Ww - EVX_FNMSUB213SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 -EVEX.66.W0.LIG.M6.bf RVM Vdq Hdq Ww - EVX_FNMSUB231SH+kr F=AVX512-FP16 TUPLE1_SCALAR_16 diff --git a/third_party/fadec/meson.build b/third_party/fadec/meson.build deleted file mode 100644 index b5dafd4..0000000 --- a/third_party/fadec/meson.build +++ /dev/null @@ -1,126 +0,0 @@ -project('fadec', ['c'], default_options: ['warning_level=3', 'c_std=c11'], - meson_version: '>=0.49') - -python3 = find_program('python3') - -# Check Python version -py_version_res = run_command(python3, ['--version'], check: true) -py_version = py_version_res.stdout().split(' ')[1] -if not py_version.version_compare('>=3.9') - error('Python 3.9 required, got @0@'.format(py_version)) -endif - -has_cpp = add_languages('cpp', required: false) - -cc = meson.get_compiler('c') -if cc.has_argument('-fstrict-aliasing') - add_project_arguments('-fstrict-aliasing', language: 'c') -endif -if get_option('warning_level').to_int() >= 3 - extra_warnings = [ - '-Wmissing-prototypes', '-Wshadow', '-Wwrite-strings', '-Wswitch-default', - '-Winline', '-Wstrict-prototypes', '-Wundef', - # We have strings longer than 4095 characters - '-Wno-overlength-strings', - # GCC 8 requires an extra option for strict cast alignment checks, Clang - # always warns, even on architectures without alignment requirements. - '-Wcast-align', '-Wcast-align=strict', - ] - add_project_arguments(cc.get_supported_arguments(extra_warnings), language: 'c') -endif -if cc.get_argument_syntax() == 'msvc' - # Disable some warnings to align warnings with GCC and Clang: - add_project_arguments('-D_CRT_SECURE_NO_WARNINGS', - '/wd4018', # - Signed/unsigned comparison - '/wd4146', # - Unary minus operator applied to unsigned - # type, result still unsigned - '/wd4244', # - Possible loss of data in conversion - # from integer type to smaller integer type - '/wd4245', # - Signed/unsigned assignment - '/wd4267', # - Possible loss of data in conversion - # from size_t to smaller type - '/wd4310', # - Possible loss of data in conversion - # of constant value to smaller type - language: 'c') -endif -if cc.get_id() == 'msvc' and has_cpp - cxx = meson.get_compiler('cpp') - if cxx.get_id() == 'msvc' - # Enable standard conformant preprocessor - add_project_arguments(cxx.get_supported_arguments(['-Zc:preprocessor']), language: 'cpp') - endif -endif - -sources = [] -headers = [] -components = [] - -if get_option('with_decode') - components += 'decode' - headers += files('fadec.h') - sources += files('decode.c', 'format.c') -endif -if get_option('with_encode') - components += 'encode' - headers += files('fadec-enc.h') - sources += files('encode.c') -endif -if get_option('with_encode2') - components += 'encode2' - headers += files('fadec-enc2.h') - sources += files('encode2.c') -endif - -generate_args = [] -if get_option('archmode') != 'only64' - generate_args += ['--32'] -endif -if get_option('archmode') != 'only32' - generate_args += ['--64'] -endif -if get_option('with_undoc') - generate_args += ['--with-undoc'] -endif -if not meson.is_subproject() - generate_args += ['--stats'] -endif - -tables = [] -foreach component : components - tables += custom_target('@0@_table'.format(component), - command: [python3, '@INPUT0@', component, - '@INPUT1@', '@OUTPUT@'] + generate_args, - input: files('parseinstrs.py', 'instrs.txt'), - output: ['fadec-@0@-public.inc'.format(component), - 'fadec-@0@-private.inc'.format(component)], - install: true, - install_dir: [get_option('includedir'), false]) -endforeach - -libfadec = static_library('fadec', sources, tables, install: true) -fadec = declare_dependency(link_with: libfadec, - include_directories: include_directories('.'), - sources: tables) -install_headers(headers) - -foreach component : components - test(component, executable('@0@-test'.format(component), - '@0@-test.c'.format(component), - dependencies: fadec)) - if component == 'encode2' and has_cpp - test(component + '-cpp', executable('@0@-test-cpp'.format(component), - '@0@-test.cc'.format(component), - dependencies: fadec)) - endif -endforeach - -if meson.version().version_compare('>=0.54.0') - meson.override_dependency('fadec', fadec) -endif - -pkg = import('pkgconfig') -pkg.generate(libraries: libfadec, - version: '0.1', - name: 'fadec', - filebase: 'fadec', - description: 'Fast Decoder for x86-32 and x86-64') diff --git a/third_party/fadec/meson_options.txt b/third_party/fadec/meson_options.txt deleted file mode 100644 index 3e8dd68..0000000 --- a/third_party/fadec/meson_options.txt +++ /dev/null @@ -1,6 +0,0 @@ -option('archmode', type: 'combo', choices: ['both', 'only32', 'only64']) -option('with_undoc', type: 'boolean', value: false) -option('with_decode', type: 'boolean', value: true) -option('with_encode', type: 'boolean', value: true) -# encode2 is off-by-default to reduce size and compile-time -option('with_encode2', type: 'boolean', value: false) diff --git a/third_party/fadec/parseinstrs.py b/third_party/fadec/parseinstrs.py deleted file mode 100644 index 435e277..0000000 --- a/third_party/fadec/parseinstrs.py +++ /dev/null @@ -1,1403 +0,0 @@ -#!/usr/bin/python3 - -import argparse -import bisect -from collections import OrderedDict, defaultdict, namedtuple -from enum import Enum -from itertools import product -import re -from typing import NamedTuple, FrozenSet, List, Tuple, Union - -INSTR_FLAGS_FIELDS, INSTR_FLAGS_SIZES = zip(*[ - ("modrm_idx", 2), - ("modreg_idx", 2), - ("vexreg_idx", 2), # note: vexreg w/o vex prefix is zeroreg_val - ("imm_idx", 2), - ("evex_bcst", 1), - ("evex_mask", 1), - ("zeroreg_val", 1), - ("lock", 1), - ("imm_control", 3), - ("vsib", 1), - ("modrm_size", 2), - ("modreg_size", 2), - ("vexreg_size", 2), - ("imm_size", 2), - ("legacy", 1), - ("unused2", 1), - ("size_fix1", 3), - ("size_fix2", 2), - ("instr_width", 1), - ("modrm_ty", 3), - ("modreg_ty", 3), - ("vexreg_ty", 2), - ("imm_ty", 0), - ("evex_rc", 2), - ("evex_bcst16", 1), - ("opsize", 3), - ("modrm", 1), - ("ign66", 1), -][::-1]) -class InstrFlags(namedtuple("InstrFlags", INSTR_FLAGS_FIELDS)): - def __new__(cls, **kwargs): - init = {**{f: 0 for f in cls._fields}, **kwargs} - return super(InstrFlags, cls).__new__(cls, **init) - def _encode(self): - enc = 0 - for value, size in zip(self, INSTR_FLAGS_SIZES): - enc = enc << size | (value & ((1 << size) - 1)) - return enc - -ENCODINGS = { - "NP": InstrFlags(), - "M": InstrFlags(modrm=1, modrm_idx=0^3), - "R": InstrFlags(modrm=1, modreg_idx=0^3), # AMX TILEZERO - "M1": InstrFlags(modrm=1, modrm_idx=0^3, imm_idx=1^3, imm_control=1), - "MI": InstrFlags(modrm=1, modrm_idx=0^3, imm_idx=1^3, imm_control=4), - "IM": InstrFlags(modrm=1, modrm_idx=1^3, imm_idx=0^3, imm_control=4), - "MC": InstrFlags(modrm=1, modrm_idx=0^3, vexreg_idx=1^3, zeroreg_val=1), - "MR": InstrFlags(modrm=1, modrm_idx=0^3, modreg_idx=1^3), - "RM": InstrFlags(modrm=1, modrm_idx=1^3, modreg_idx=0^3), - "RMA": InstrFlags(modrm=1, modrm_idx=1^3, modreg_idx=0^3, vexreg_idx=2^3), - "MRI": InstrFlags(modrm=1, modrm_idx=0^3, modreg_idx=1^3, imm_idx=2^3, imm_control=4), - "RMI": InstrFlags(modrm=1, modrm_idx=1^3, modreg_idx=0^3, imm_idx=2^3, imm_control=4), - "MRC": InstrFlags(modrm=1, modrm_idx=0^3, modreg_idx=1^3, vexreg_idx=2^3, zeroreg_val=1), - "AM": InstrFlags(modrm=1, modrm_idx=1^3, vexreg_idx=0^3), - "MA": InstrFlags(modrm=1, modrm_idx=0^3, vexreg_idx=1^3), - "I": InstrFlags(imm_idx=0^3, imm_control=4), - "IA": InstrFlags(vexreg_idx=0^3, imm_idx=1^3, imm_control=4), - "O": InstrFlags(modrm_idx=0^3), - "OI": InstrFlags(modrm_idx=0^3, imm_idx=1^3, imm_control=4), - "OA": InstrFlags(modrm_idx=0^3, vexreg_idx=1^3), - "S": InstrFlags(modreg_idx=0^3), # segment register in bits 3,4,5 - "A": InstrFlags(vexreg_idx=0^3), - "D": InstrFlags(imm_idx=0^3, imm_control=6), - "FD": InstrFlags(vexreg_idx=0^3, imm_idx=1^3, imm_control=2), - "TD": InstrFlags(vexreg_idx=1^3, imm_idx=0^3, imm_control=2), - - "RVM": InstrFlags(modrm=1, modrm_idx=2^3, modreg_idx=0^3, vexreg_idx=1^3), - "RVMI": InstrFlags(modrm=1, modrm_idx=2^3, modreg_idx=0^3, vexreg_idx=1^3, imm_idx=3^3, imm_control=4), - "RVMR": InstrFlags(modrm=1, modrm_idx=2^3, modreg_idx=0^3, vexreg_idx=1^3, imm_idx=3^3, imm_control=3), - "RMV": InstrFlags(modrm=1, modrm_idx=1^3, modreg_idx=0^3, vexreg_idx=2^3), - "VM": InstrFlags(modrm=1, modrm_idx=1^3, vexreg_idx=0^3), - "VMI": InstrFlags(modrm=1, modrm_idx=1^3, vexreg_idx=0^3, imm_idx=2^3, imm_control=4), - "MVR": InstrFlags(modrm=1, modrm_idx=0^3, modreg_idx=2^3, vexreg_idx=1^3), - "MRV": InstrFlags(modrm=1, modrm_idx=0^3, modreg_idx=1^3, vexreg_idx=2^3), -} -ENCODING_OPTYS = ["modrm", "modreg", "vexreg", "imm"] -ENCODING_OPORDER = { enc: sorted(ENCODING_OPTYS, key=lambda ty: getattr(ENCODINGS[enc], ty+"_idx")^3) for enc in ENCODINGS} - -OPKIND_CANONICALIZE = { - "I": "IMM", # immediate - "A": "IMM", # Direct address, far jmp - "J": "IMM", # RIP-relative address - "M": "MEM", # ModRM.r/m selects memory only - "O": "MEM", # Direct address, FD/TD encoding - "R": "GP", # ModRM.r/m selects GP - "B": "GP", # VEX.vvvv selects GP - "E": "GP", # ModRM.r/m selects GP or memory - "G": "GP", # ModRM.reg selects GP - "P": "MMX", # ModRM.reg selects MMX - "N": "MMX", # ModRM.r/m selects MMX - "Q": "MMX", # ModRM.r/m selects MMX or memory - "V": "XMM", # ModRM.reg selects XMM - "H": "XMM", # VEX.vvvv selects XMM - "L": "XMM", # bits7:4 of imm8 select XMM - "U": "XMM", # ModRM.r/m selects XMM - "W": "XMM", # ModRM.r/m selects XMM or memory - "S": "SEG", # ModRM.reg selects SEG - "C": "CR", # ModRM.reg selects CR - "D": "DR", # ModRM.reg selects DR - - # Custom names - "F": "FPU", # F is used for RFLAGS by Intel - "K": "MASK", - "T": "TMM", - "Z": "BND", -} -OPKIND_SIZES = { - "b": 1, - "w": 2, - "d": 4, - "ss": 4, # Scalar single of XMM (d) - "q": 8, - "sd": 8, # Scalar double of XMM (q) - "t": 10, # FPU/ten-byte - "dq": 16, - "qq": 32, - "oq": 64, # oct-quadword - "": 0, # for MEMZ - "v": -1, # operand size (w/d/q) - "y": -1, # operand size (d/q) - "z": -1, # w/d (immediates, min(operand size, 4)) - "a": -1, # z:z - "p": -1, # w:z - "x": -2, # vector size - "h": -3, # half x - "f": -4, # fourth x - "e": -5, # eighth x - "pd": -2, # packed double (x) - "ps": -2, # packed single (x) - - # Custom names - "bs": -1, # sign-extended immediate - "zd": 4, # z-immediate, but always 4-byte operand - "zq": 8, # z-immediate, but always 8-byte operand -} -class OpKind(NamedTuple): - regkind: str - sizestr: str - - SZ_OP = -1 - SZ_VEC = -2 - SZ_VEC_HALF = -3 - SZ_VEC_QUARTER = -4 - SZ_VEC_EIGHTH = -5 - - def abssize(self, opsz=None, vecsz=None): - res = opsz if self.size == self.SZ_OP else \ - vecsz if self.size == self.SZ_VEC else \ - vecsz >> 1 if self.size == self.SZ_VEC_HALF else \ - vecsz >> 2 if self.size == self.SZ_VEC_QUARTER else \ - vecsz >> 3 if self.size == self.SZ_VEC_EIGHTH else self.size - if res is None: - raise Exception("unspecified operand size") - return res - def immsize(self, opsz): - maxsz = 1 if self.sizestr == "bs" else 4 if self.sizestr[0] == "z" else 8 - return min(maxsz, self.abssize(opsz)) - @property - def kind(self): - return OPKIND_CANONICALIZE[self.regkind] - @property - def size(self): - return OPKIND_SIZES[self.sizestr] - @classmethod - def parse(cls, op): - return cls(op[0], op[1:]) - - def __eq__(self, other): - # Custom equality for canonicalization of kind/size. - return isinstance(other, OpKind) and self.kind == other.kind and self.size == other.size - -class InstrDesc(NamedTuple): - mnemonic: str - encoding: str - operands: Tuple[str, ...] - flags: FrozenSet[str] - - OPKIND_REGTYS = { - ("modrm", "GP"): 1, ("modreg", "GP"): 1, ("vexreg", "GP"): 1, - ("modrm", "XMM"): 0, ("modreg", "XMM"): 0, ("vexreg", "XMM"): 0, - ("modrm", "MMX"): 5, ("modreg", "MMX"): 5, - ("modrm", "FPU"): 4, ("vexreg", "FPU"): 3, - ("modrm", "TMM"): 6, ("modreg", "TMM"): 6, ("vexreg", "TMM"): 3, - ("modrm", "MASK"): 7, ("modreg", "MASK"): 7, ("vexreg", "MASK"): 2, - ("modreg", "SEG"): 3, - ("modreg", "DR"): 0, # handled in code - ("modreg", "CR"): 0, # handled in code - ("modrm", "MEM"): 0, - ("imm", "MEM"): 0, ("imm", "IMM"): 0, ("imm", "XMM"): 0, - } - OPKIND_SIZES = { - 0: 0, 1: 1, 2: 2, 4: 3, 8: 4, 16: 5, 32: 6, 64: 7, 10: 0, - # OpKind.SZ_OP: -2, OpKind.SZ_VEC: -3, OpKind.SZ_HALFVEC: -4, - } - - @classmethod - def parse(cls, desc): - desc = desc.split() - mnem, _, compactDesc = desc[5].partition("+") - flags = frozenset(desc[6:] + [{ - "w": "INSTR_WIDTH", - "a": "U67", - "s": "USEG", - "k": "MASK", - "b": "BCST", - "e": "SAE", - "r": "ER", - }[c] for c in compactDesc]) - operands = tuple(OpKind.parse(op) for op in desc[1:5] if op != "-") - return cls(mnem, desc[0], operands, flags) - - def imm_size(self, opsz): - flags = ENCODINGS[self.encoding] - if flags.imm_control < 3: - return 0 - if flags.imm_control == 3: - return 1 - if self.mnemonic == "ENTER": - return 3 - return self.operands[flags.imm_idx^3].immsize(opsz) - - def dynsizes(self): - dynopsz = set(op.size for op in self.operands if op.size < 0) - if {"INSTR_WIDTH", "SZ8"} & self.flags: dynopsz.add(OpKind.SZ_OP) - if OpKind.SZ_OP in dynopsz and len(dynopsz) > 1: - raise Exception(f"conflicting dynamic operand sizes in {self}") - return dynopsz - - def encode(self, mnem, ign66, modrm): - flags = ENCODINGS[self.encoding] - extraflags = {} - - dynopsz = self.dynsizes() - # Operand size either refers to vectors or GP, but not both - if dynopsz and OpKind.SZ_OP not in dynopsz: # Vector operand size - if self.flags & {"SZ8", "D64", "F64", "INSTR_WIDTH", "LOCK", "U66"}: - raise Exception(f"incompatible flags in {self}") - # Allow at most the vector size together with one alternative - dynsizes = [OpKind.SZ_VEC] + list(dynopsz - {OpKind.SZ_VEC}) - extraflags["opsize"] = 4 | (OpKind.SZ_VEC - dynsizes[-1]) - if len(dynsizes) > 2: - raise Exception(f"conflicting vector operand sizes in {self}") - else: # either empty or GP operand size - dynsizes = [OpKind.SZ_OP] - if "SZ8" in self.flags: - dynsizes = [] - if "D64" in self.flags: extraflags["opsize"] = 2 - if "F64" in self.flags: extraflags["opsize"] = 3 - extraflags["lock"] = "LOCK" in self.flags - - if (self.flags & {"SZ8", "INSTR_WIDTH"} or - mnem in ("MOVSX", "MOVZX", "XCHG_NOP", "3DNOW")): - extraflags["legacy"] = 1 - # INSTR_WIDTH defaults to zero, so only enable when SZ8 is unset - if "INSTR_WIDTH" in self.flags and "SZ8" not in self.flags: - extraflags["instr_width"] = 1 - - imm_byte = self.imm_size(4) == 1 - extraflags["imm_control"] = flags.imm_control | imm_byte - - # Sort fixed sizes encodable in size_fix2 as second element. - # But: byte-sized immediates are handled specially and don't cost space. - fixed = set(self.OPKIND_SIZES[op.size] for op in self.operands if - op.size >= 0 and not (imm_byte and op.kind == "IMM")) - fixed = sorted(fixed, key=lambda x: 1 <= x <= 4) - if len(fixed) > 2 or (len(fixed) == 2 and not (1 <= fixed[1] <= 4)): - raise Exception(f"invalid fixed sizes {fixed} in {self}") - sizes = (fixed + [1, 1])[:2] + dynsizes # See operand_sizes in decode.c. - extraflags["size_fix1"] = sizes[0] - extraflags["size_fix2"] = sizes[1] - 1 - - for i, opkind in enumerate(self.operands): - sz = self.OPKIND_SIZES[opkind.size] if opkind.size >= 0 else opkind.size - if opkind.kind == "IMM": - if imm_byte and sz not in [1] + dynsizes[:1]: - raise Exception(f"imm_byte with opsize {sz} in {self}") - extraflags[f"imm_size"] = sz == 1 if imm_byte else sizes.index(sz) - else: - opname = ENCODING_OPORDER[self.encoding][i] - extraflags[f"{opname}_size"] = sizes.index(sz) - extraflags[f"{opname}_ty"] = self.OPKIND_REGTYS[opname, opkind.kind] - - # Miscellaneous Flags - if "VSIB" in self.flags: extraflags["vsib"] = 1 - if "BCST" in self.flags: extraflags["evex_bcst"] = 1 - if "BCST16" in self.flags: extraflags["evex_bcst16"] = 1 - if "MASK" in self.flags: extraflags["evex_mask"] = 1 - if "SAE" in self.flags: extraflags["evex_rc"] = 1 - if "ER" in self.flags: extraflags["evex_rc"] = 3 - if modrm: extraflags["modrm"] = 1 - - if "U66" not in self.flags and (ign66 or "I66" in self.flags): - extraflags["ign66"] = 1 - - enc = flags._replace(**extraflags)._encode() - enc = tuple((enc >> i) & 0xffff for i in range(0, 48, 16)) - # First 2 bytes are the mnemonic, last 6 bytes are the encoding. - return f"{{FDI_{mnem}, {enc[0]}, {enc[1]}, {enc[2]}}}" - -class EntryKind(Enum): - NONE = 0x00 - PREFIX = 0x10 - INSTR = 0x20 - WEAKINSTR = 0x30 - TABLE16 = 0x01 - TABLE8E = 0x11 - ESCAPE = 0x02 - TABLE256 = 0x12 - TABLE_VEX = 0x22 - TABLE_PREFIX = 0x03 - TABLE_ROOT = -1 - @property - def is_table(self): - return self != EntryKind.INSTR and self != EntryKind.WEAKINSTR and self != EntryKind.PREFIX - -opcode_regex = re.compile( - r"^(?:(?P(?PE?VEX\.)?(?PNP|66|F2|F3|NFx)\." + - r"(?:W(?P[01])\.)?(?:L(?P0|1|12|2|IG)\.)?))?" + - r"(?P0f38|0f3a|0f|M[567]\.|)" + - r"(?P[0-9a-f]{2})" + - r"(?:/(?P[0-7]|[rm][0-7]?|[0-7][rm])|(?P[c-f][0-9a-f]))?(?P\+)?$") - -class Opcode(NamedTuple): - prefix: Union[None, str] # None/NP/66/F2/F3/NFx - escape: int # [0, 0f, 0f38, 0f3a] - opc: int - extended: bool # Extend opc or opcext in ModRM.rm, if present - # Fixed ModRM.mod ("r"/"m"), ModRM.reg, ModRM.rm (opcext + AMX) - modrm: Tuple[Union[None, str], Union[None, int], Union[None, int]] - vex: int # 0 = legacy, 1 = VEX, 2 = EVEX - vexl: Union[str, None] # 0, 1, 12, 2, IG, None = used, both - rexw: Union[str, None] # 0, 1, None = both (or ignored) - - @classmethod - def parse(cls, opcode_string): - match = opcode_regex.match(opcode_string) - if match is None: - raise Exception(opcode_string) - return None - - opcext = int(match.group("opcext") or "0", 16) - modreg = match.group("modreg") - if opcext: - modrm = "r", (opcext >> 3) & 7, opcext & 7 - elif modreg: - if modreg[0] in "rm": - modrm = modreg[0], None, int(modreg[1:]) if modreg[1:] else None - else: - modrm = modreg[1:] or None, int(modreg[0]), None - else: - modrm = None, None, None - - return cls( - prefix=match.group("legacy"), - escape=["", "0f", "0f38", "0f3a", "M4.", "M5.", "M6.", "M7."].index(match.group("escape")), - opc=int(match.group("opcode"), 16), - extended=match.group("extended") is not None, - modrm=modrm, - vex=[None, "VEX.", "EVEX."].index(match.group("vex")), - vexl=match.group("vexl"), - rexw=match.group("rexw"), - ) - -def verifyOpcodeDesc(opcode, desc): - flags = ENCODINGS[desc.encoding] - oporder = ENCODING_OPORDER[desc.encoding] - expected_immkinds = ["", "I", "O", "L", "IA", "", "J"][flags.imm_control] - fixed_mod = opcode.modrm[0] - if opcode.extended or desc.mnemonic in ("MOV_CR2G", "MOV_DR2G", "MOV_G2CR", "MOV_G2DR"): - fixed_mod = "r" - expected_modrmkinds = {None: "EQWFKT", "r": "RNUFKT", "m": "M"}[fixed_mod] - # allow F and R for zeroreg, which we overlap with vexreg - expected_vexkinds = "BHKT" if opcode.vex else "BHRF" - for i, opkind in enumerate(desc.operands): - if oporder[i] == "modrm" and opkind.regkind not in expected_modrmkinds: - raise Exception(f"modrm operand-regkind mismatch {opcode}, {desc}") - if oporder[i] == "modreg" and opkind.regkind not in "GPVSCDFKT": - raise Exception(f"modreg operand-regkind mismatch {opcode}, {desc}") - if oporder[i] == "vexreg" and opkind.regkind not in expected_vexkinds: - raise Exception(f"vexreg operand-regkind mismatch {opcode}, {desc}") - if oporder[i] == "imm" and opkind.regkind not in expected_immkinds: - raise Exception(f"imm operand-regkind mismatch {opcode}, {desc}") - if "INSTR_WIDTH" in desc.flags and len(desc.operands) > 3: - raise Exception(f"+w with four operands {opcode}, {desc}") - if opcode.escape == 2 and flags.imm_control != 0: - raise Exception(f"0f38 has no immediate operand {opcode}, {desc}") - if opcode.escape == 3 and desc.imm_size(4) != 1: - raise Exception(f"0f3a must have immediate byte {opcode}, {desc}") - if opcode.escape == 0 and opcode.prefix is not None: - raise Exception(f"unescaped opcode has prefix {opcode}, {desc}") - if opcode.escape == 0 and opcode.vexl is not None: - raise Exception(f"unescaped opcode has L specifier {opcode}, {desc}") - if opcode.escape == 0 and opcode.rexw is not None: - raise Exception(f"unescaped opcode has W specifier {opcode}, {desc}") - if opcode.escape == 0 and opcode.vex: - raise Exception(f"VEX opcode without escape {opcode}, {desc}") - if opcode.vex and opcode.extended: - raise Exception(f"VEX/EVEX must not be extended {opcode}, {desc}") - if opcode.vex and opcode.prefix not in ("NP", "66", "F2", "F3"): - raise Exception(f"VEX/EVEX must have mandatory prefix {opcode}, {desc}") - if opcode.vexl == "IG" and desc.dynsizes() - {OpKind.SZ_OP}: - raise Exception(f"(E)VEX.LIG with dynamic vector size {opcode}, {desc}") - if "VSIB" in desc.flags and opcode.modrm[0] != "m": - raise Exception(f"VSIB for non-memory opcode {opcode}, {desc}") - if opcode.vex == 2 and flags.vexreg_idx: - # Checking this here allows to omit check for V' in decoder. - if desc.operands[flags.vexreg_idx ^ 3].kind != "XMM": - raise Exception(f"EVEX.vvvv must refer to XMM {opcode}, {desc}") - if opcode.vex == 2 and flags.modreg_idx and flags.modreg_idx ^ 3 != 0: - # EVEX.z=0 is only checked for mask operands in ModReg - if desc.operands[flags.modreg_idx ^ 3].kind == "MASK": - raise Exception(f"ModRM.reg mask not first operand {opcode}, {desc}") - # Verify tuple type - if opcode.vex == 2 and opcode.modrm[0] != "r": - tts = [s for s in desc.flags if s.startswith("TUPLE")] - if len(tts) != 1: - raise Exception(f"missing tuple type in {opcode}, {desc}") - if flags.modrm_idx == 3 ^ 3: - raise Exception(f"missing memory operand {opcode}, {desc}") - # From Intel SDM - bcst, evexw, vszs = { - "TUPLE_FULL_16": (2, "0", ( 16, 32, 64)), - "TUPLE_FULL_32": (4, "0", ( 16, 32, 64)), - "TUPLE_FULL_64": (8, "1", ( 16, 32, 64)), - "TUPLE_HALF_16": (2, "0", ( 8, 16, 32)), - "TUPLE_HALF_32": (4, "0", ( 8, 16, 32)), - "TUPLE_HALF_64": (8, "1", ( 8, 16, 32)), - "TUPLE_QUARTER_16": (2, "0", ( 4, 8, 16)), - "TUPLE_FULL_MEM": (None, None, ( 16, 32, 64)), - "TUPLE_HALF_MEM": (None, None, ( 8, 16, 32)), - "TUPLE_QUARTER_MEM": (None, None, ( 4, 8, 16)), - "TUPLE_EIGHTH_MEM": (None, None, ( 2, 4, 8)), - "TUPLE1_SCALAR_8": (None, None, ( 1, 1, 1)), - "TUPLE1_SCALAR_16": (None, None, ( 2, 2, 2)), - "TUPLE1_SCALAR_32": (None, "0", ( 4, 4, 4)), - "TUPLE1_SCALAR_64": (None, "1", ( 8, 8, 8)), - "TUPLE1_SCALAR_OPSZ": (None, None, ( 0, 0, 0)), - "TUPLE1_FIXED_32": (None, None, ( 4, 4, 4)), - "TUPLE1_FIXED_64": (None, None, ( 8, 8, 8)), - "TUPLE2_32": (None, "0", ( 8, 8, 8)), - "TUPLE2_64": (None, "1", (None, 16, 16)), - "TUPLE4_32": (None, "0", (None, 16, 16)), - "TUPLE4_64": (None, "1", (None, None, 32)), - "TUPLE8_32": (None, "0", (None, None, 32)), - "TUPLE_MEM128": (None, None, ( 16, 16, 16)), - # TODO: Fix MOVDDUP tuple size :( - "TUPLE_MOVDDUP": (None, None, ( 16, 32, 64)), - }[tts[0]] - if "BCST" in desc.flags: - if bcst is None: - raise Exception(f"broadcast on incompatible type {opcode}, {desc}") - if ("BCST16" in desc.flags) != (bcst == 2): - raise Exception(f"bcst16 mismatch, should be {bcst} {opcode}, {desc}") - # EVEX.W is used to distinguish 4/8-byte broadcast size - if evexw and opcode.rexw != evexw: - raise Exception(f"incompatible EVEX.W {opcode}, {desc}") - for l, tupsz in enumerate(vszs): - opsz = desc.operands[flags.modrm_idx ^ 3].abssize(0, 16 << l) - if tupsz is not None and opsz != tupsz: - raise Exception(f"memory size {opsz} != {tupsz} {opcode}, {desc}") - -class Trie: - KIND_ORDER = (EntryKind.TABLE_ROOT, EntryKind.ESCAPE, EntryKind.TABLE256, - EntryKind.TABLE_PREFIX, EntryKind.TABLE16, - EntryKind.TABLE8E, EntryKind.TABLE_VEX) - TABLE_LENGTH = { - EntryKind.TABLE_ROOT: 256, - EntryKind.ESCAPE: 8, - EntryKind.TABLE256: 256, - EntryKind.TABLE_PREFIX: 4, - EntryKind.TABLE16: 16, - EntryKind.TABLE8E: 8, - EntryKind.TABLE_VEX: 8, - } - - def __init__(self, root_count): - self.trie = [] - self.trie.append([None] * root_count) - self.kindmap = defaultdict(list) - - def _add_table(self, kind): - self.trie.append([None] * self.TABLE_LENGTH[kind]) - self.kindmap[kind].append(len(self.trie) - 1) - return len(self.trie) - 1 - - def _clone(self, elem): - if not elem or not elem[0].is_table: - return elem - new_num = self._add_table(elem[0]) - self.trie[new_num] = [self._clone(e) for e in self.trie[elem[1]]] - return elem[0], new_num - - def _transform_opcode(self, opc): - realopcext = opc.extended and opc.modrm[2] is None - topc = [opc.opc + i for i in range(8 if realopcext else 1)] - if opc.escape == 0 and opc.opc in (0xc4, 0xc5, 0x62): - assert opc.prefix is None - assert opc.modrm == ("m", None, None) - assert opc.rexw is None - assert opc.vexl is None - # We do NOT encode /m, this is handled by prefix code. - # Order must match KIND_ORDER. - return topc, [0], None, None, None, None, None - elif opc.escape == 0: - troot, tescape, topc = topc, None, None - else: - troot = [[0x0f], [0xc4, 0xc5], [0x62]][opc.vex] - tescape = [opc.escape] - - tprefix, t16, t8e, tvex = None, None, None, None - if opc.prefix == "NFx": - tprefix = [0, 1] - elif opc.prefix: - tprefix = [["NP", "66", "F3", "F2"].index(opc.prefix)] - if opc.modrm != (None, None, None): - # TODO: optimize for /r and /m specifiers to reduce size - mod = {"m": [0], "r": [1], None: [0, 1]}[opc.modrm[0]] - reg = [opc.modrm[1]] if opc.modrm[1] is not None else list(range(8)) - t16 = [x + (y << 1) for x in mod for y in reg] - if opc.modrm[2] is not None and not opc.extended: - t8e = [opc.modrm[2]] - if opc.rexw is not None or (opc.vexl or "IG") != "IG": - rexw = {"0": [0], "1": [1<<0], None: [0, 1<<0]}[opc.rexw] - if opc.vex < 2: - vexl = {"0": [0], "1": [1<<1], "IG": [0, 1<<1]}[opc.vexl or "IG"] - else: - vexl = {"0": [0], "12": [1<<1, 2<<1], "2": [2<<1], "IG": [0, 1<<1, 2<<1, 3<<1]}[opc.vexl or "IG"] - tvex = list(map(sum, product(rexw, vexl))) - # Order must match KIND_ORDER. - return troot, tescape, topc, tprefix, t16, t8e, tvex - - def add_opcode(self, opcode, descidx, root_idx, weak=False): - opcode = self._transform_opcode(opcode) - frontier = [(0, root_idx)] - for elem_kind, elem in zip(self.KIND_ORDER, opcode): - new_frontier = [] - for entry_num, entry_idx in frontier: - entry = self.trie[entry_num] - if elem is None: - if entry[entry_idx] is None or entry[entry_idx][0] != elem_kind: - new_frontier.append((entry_num, entry_idx)) - continue - elem = list(range(self.TABLE_LENGTH[elem_kind])) - if entry[entry_idx] is None: - new_num = self._add_table(elem_kind) - entry[entry_idx] = elem_kind, new_num - elif entry[entry_idx][0] != elem_kind: - # Need to add a new node here and copy entry one level below - new_num = self._add_table(elem_kind) - # Keep original entry, but clone others recursively - self.trie[new_num][0] = entry[entry_idx] - for i in range(1, len(self.trie[new_num])): - self.trie[new_num][i] = self._clone(entry[entry_idx]) - entry[entry_idx] = elem_kind, new_num - for elem_idx in elem: - new_frontier.append((entry[entry_idx][1], elem_idx)) - frontier = new_frontier - for entry_num, entry_idx in frontier: - entry = self.trie[entry_num] - if not entry[entry_idx] or entry[entry_idx][0] == EntryKind.WEAKINSTR: - kind = EntryKind.INSTR if not weak else EntryKind.WEAKINSTR - entry[entry_idx] = kind, descidx << 2 - elif not weak: - raise Exception(f"redundant non-weak {opcode}") - - def add_prefix(self, byte, prefix, root_idx): - if self.trie[0][root_idx] is None: - self.trie[0][root_idx] = EntryKind.TABLE_ROOT, self._add_table(EntryKind.TABLE_ROOT) - self.trie[self.trie[0][root_idx][1]][byte] = EntryKind.PREFIX, prefix - - def deduplicate(self): - synonyms = {} - for kind in self.KIND_ORDER[::-1]: - entries = {} - for num in self.kindmap[kind]: - # Replace previous synonyms - entry = self.trie[num] - for i, elem in enumerate(entry): - if elem and elem[0].is_table and elem[1] in synonyms: - entry[i] = synonyms[elem[1]] - - unique_entry = tuple(entry) - if len(set(unique_entry)) == 1: - # Omit kind if all entries point to the same child - synonyms[num] = entry[0] - self.trie[num] = None - elif unique_entry in entries: - # Deduplicate entries of this kind - synonyms[num] = kind, entries[unique_entry] - self.trie[num] = None - else: - entries[unique_entry] = num - - def compile(self): - offsets = [None] * len(self.trie) - last_off = 0 - for num, entry in enumerate(self.trie[1:], start=1): - if not entry: - continue - offsets[num] = last_off - last_off += (len(entry) + 3) & ~3 - if last_off >= 0x8000: - raise Exception(f"maximum table size exceeded: {last_off:#x}") - - data = [0] * last_off - for off, entry in zip(offsets, self.trie): - if off is None: - continue - for i, elem in enumerate(entry, start=off): - if elem is not None: - value = offsets[elem[1]] if elem[0].is_table else elem[1] - data[i] = value | (elem[0].value & 3) - return tuple(data), [offsets[v] for _, v in self.trie[0]] - - @property - def stats(self): - return {k.name: sum(self.trie[e] is not None for e in v) - for k, v in self.kindmap.items()} - - -def superstring(strs): - # This faces the "shortest superstring" problem, which is NP-hard. - # Preprocessing: remove any strings which are already completely covered - realstrs = [] - for s in sorted(strs, key=len, reverse=True): - for s2 in realstrs: - if s in s2: - break - else: - realstrs.append(s) - - # Greedy heuristic generally yields acceptable results, though it depends on - # the order of the menmonics. More compact results are possible, but the - # expectable gains of an optimal result (probably with O(n!)) are small. - # First sort strings and later do a binary search for each possible prefix. - realstrs.sort() - merged = "" - while realstrs: - for i in range(min(16, len(merged)), 0, -1): - idx = bisect.bisect_left(realstrs, merged[-i:]) - if idx < len(realstrs) and realstrs[idx][:i] == merged[-i:]: - merged += realstrs.pop(idx)[i:] - break - else: - merged += realstrs.pop() - return merged - -def decode_table(entries, args): - modes = args.modes - - trie = Trie(root_count=len(modes)) - for i, mode in enumerate(modes): - # Magic values must match PF_* enum in decode.c. - trie.add_prefix(0x66, 0xfffa, i) - trie.add_prefix(0x67, 0xfffb, i) - trie.add_prefix(0xf0, 0xfffc, i) - trie.add_prefix(0xf2, 0xfffd, i) - trie.add_prefix(0xf3, 0xfffd, i) - trie.add_prefix(0x64, 0xfff9, i) - trie.add_prefix(0x65, 0xfff9, i) - for seg in (0x26, 0x2e, 0x36, 0x3e): - trie.add_prefix(seg, 0xfff8 + (mode <= 32), i) - if mode > 32: - for rex in range(0x40, 0x50): - trie.add_prefix(rex, 0xfffe, i) - - # pause is hardcoded together with XCHG_NOP. - mnems, descs, desc_map = {"PAUSE"}, [], {} - descs.append("{0}") # desc index zero is "invalid" - for weak, opcode, desc in entries: - ign66 = opcode.prefix in ("NP", "66", "F2", "F3") - modrm = opcode.modrm != (None, None, None) - mnem = { - "PUSH_SEG": "PUSH", "POP_SEG": "POP", - "MOV_CR2G": "MOV_CR", "MOV_G2CR": "MOV_CR", - "MOV_DR2G": "MOV_DR", "MOV_G2DR": "MOV_DR", - "MMX_MOVD_M2G": "MMX_MOVD", "MMX_MOVD_G2M": "MMX_MOVD", - "MMX_MOVQ_M2G": "MMX_MOVQ", "MMX_MOVQ_G2M": "MMX_MOVQ", - "SSE_MOVD_X2G": "SSE_MOVD", "SSE_MOVD_G2X": "SSE_MOVD", - "SSE_MOVQ_X2G": "SSE_MOVQ", "SSE_MOVQ_G2X": "SSE_MOVQ", - "VMOVD_X2G": "VMOVD", "VMOVD_G2X": "VMOVD", - "VMOVQ_X2G": "VMOVQ", "VMOVQ_G2X": "VMOVQ", - }.get(desc.mnemonic, desc.mnemonic) - mnems.add(mnem) - descenc = desc.encode(mnem, ign66, modrm) - desc_idx = desc_map.get(descenc) - if desc_idx is None: - desc_idx = desc_map[descenc] = len(descs) - descs.append(descenc) - for i, mode in enumerate(modes): - if "IO"[mode <= 32]+"64" not in desc.flags: - trie.add_opcode(opcode, desc_idx, i, weak) - - trie.deduplicate() - table_data, root_offsets = trie.compile() - - mnems = sorted(mnems) - decode_mnems_lines = [f"FD_MNEMONIC({m},{i})\n" for i, m in enumerate(mnems)] - - mnemonics_intel = [m.replace("SSE_", "").replace("MMX_", "") - .replace("EVX_", "V") - .replace("MOVABS", "MOV").replace("RESERVED_", "") - .replace("JMPF", "JMP FAR").replace("CALLF", "CALL FAR") - .replace("_S2G", "").replace("_G2S", "") - .replace("_X2G", "").replace("_G2X", "") - .replace("_CR", "").replace("_DR", "") - .replace("REP_", "REP ").replace("CMPXCHGD", "CMPXCHG") - .replace("JCXZ", "JCXZ JECXZJRCXZ") - .replace("C_SEP", "CWD CDQ CQO") - .replace("C_EX", "CBW CWDECDQE").replace("XCHG_NOP", "") - .lower() for m in mnems] - mnemonics_str = superstring(mnemonics_intel) - - if args.stats: - print(f"Decode stats: Descs -- {len(descs)} ({8*len(descs)} bytes); ", - f"Trie -- {2*len(table_data)} bytes, {trie.stats}; " - f"Mnems -- {len(mnemonics_str)} + {3*len(mnemonics_intel)} bytes") - - defines = ["FD_TABLE_OFFSET_%d %d\n"%k for k in zip(modes, root_offsets)] - - return "".join(decode_mnems_lines), f"""// Auto-generated file -- do not modify! -#if defined(FD_DECODE_TABLE_DATA) -{"".join(f"{e:#06x}," for e in table_data)} -#elif defined(FD_DECODE_TABLE_DESCS) -{",".join(descs)} -#elif defined(FD_DECODE_TABLE_STRTAB1) -"{mnemonics_str}" -#elif defined(FD_DECODE_TABLE_STRTAB2) -{",".join(str(mnemonics_str.index(mnem)) for mnem in mnemonics_intel)} -#elif defined(FD_DECODE_TABLE_STRTAB3) -{",".join(str(len(mnem)) for mnem in mnemonics_intel)} -#elif defined(FD_DECODE_TABLE_DEFINES) -{"".join("#define " + line for line in defines)} -#else -#error "unspecified decode table" -#endif -""" - -class EncodeVariant(NamedTuple): - opcode: Opcode - desc: InstrDesc - evexbcst: bool = False - evexmask: int = 0 # 0 = none, 1 = must have mask, 2 = mask + EVEX.z - evexsae: int = 0 # 0 = no EVEX.b, 1 = EVEX.b, 2 = EVEX.b + L'L is rounding mode - evexdisp8scale: int = 0 # EVEX disp8 shift - downgrade: int = 0 # 0 = none, 1 = to VEX, 2 = to VEX flipping REXW - flexcc: bool = False # Flexible condition code - -def encode_mnems(entries): - # mapping from (mnem, opsize, ots) -> (opcode, desc) - mnemonics = defaultdict(list) - # Cannot have PAUSE in instrs.txt, because opcodes in without escape must - # not have mandatory prefixes. For decode, this is hardcoded. - mnemonics["PAUSE", 0, ""] = [EncodeVariant(Opcode.parse("F3.90"), InstrDesc.parse("NP - - - - NOP"))] - for weak, opcode, desc in entries: - if "I64" in desc.flags or desc.mnemonic[:9] == "RESERVED_": - continue - mnem_name = {"MOVABS": "MOV", "XCHG_NOP": "XCHG"}.get(desc.mnemonic, desc.mnemonic) - mnem_name = mnem_name.replace("EVX_", "V") - - opsizes, vecsizes = {0}, {0} - prepend_opsize, prepend_vecsize = False, False - # Where to put the operand size in the mnemonic - separate_opsize = "ENC_SEPSZ" in desc.flags - - if "ENC_NOSZ" in desc.flags or not desc.dynsizes(): - pass - elif OpKind.SZ_OP in desc.dynsizes(): - if opcode.rexw is not None: - raise Exception(f"unexpected REXW specifier {desc}") - opsizes = {8} if "SZ8" in desc.flags else {16, 32, 64} - if opcode.prefix in ("NP", "66", "F2", "F3") and "U66" not in desc.flags: - opsizes -= {16} - if "I66" in desc.flags: - opsizes -= {16} - if "D64" in desc.flags: - opsizes -= {32} - prepend_opsize = not separate_opsize - if "F64" in desc.flags: - opsizes = {64} - prepend_opsize = False - elif opcode.vex and opcode.vexl != "IG": # vectors; don't care for SSE - vecsizes = {128, 256, 512} if opcode.vex == 2 else {128, 256} - if opcode.vexl: - vecsizes = {128 << int(c) for c in opcode.vexl} - prepend_vecsize = not separate_opsize - - # All encoding types; reg is r/k (mask); modrm is r/m/b (broadcast) - optypes_base = [] - for i, opkind in enumerate(desc.operands): - reg = "k" if opkind.kind == "MASK" else "r" - opname = ENCODING_OPORDER[desc.encoding][i] - if opname == "modrm": - modrm_type = (opcode.modrm[0] or "rm").replace("r", reg) - if opcode.extended or desc.mnemonic in ("MOV_CR2G", "MOV_DR2G", "MOV_G2CR", "MOV_G2DR"): - modrm_type = reg - if "BCST" in desc.flags: - modrm_type += "b" - optypes_base.append(modrm_type) - elif opname == "modreg" or opname == "vexreg": - optypes_base.append(reg) - else: - optypes_base.append(" iariioo"[ENCODINGS[desc.encoding].imm_control]) - optypes = ["".join(x) for x in product(*optypes_base)] - - prefixes = [("", "")] - if "LOCK" in desc.flags: - prefixes.append(("LOCK_", "LOCK")) - if "ENC_REP" in desc.flags: - prefixes.append(("REP_", "F3")) - if "ENC_REPCC" in desc.flags: - prefixes.append(("REPNZ_", "F2")) - prefixes.append(("REPZ_", "F3")) - - evexmasks = [0] - if "MASK" in desc.flags: - if "VSIB" in desc.flags: - evexmasks = [1] - else: - evexmasks.append(1) - if desc.operands[0].kind != "MASK": - evexmasks.append(2) # maskz only for non-mask destinations - evexsaes = [0] - if "SAE" in desc.flags: - evexsaes.append(1) - elif "ER" in desc.flags: - evexsaes.append(2) - - keys = (opsizes, vecsizes, prefixes, optypes, evexmasks, evexsaes) - for opsize, vecsize, prefix, ots, evexmask, evexsae in product(*keys): - has_memory = "m" in ots or "b" in ots - if prefix[1] == "LOCK" and ots[0] != "m": - continue - if evexmask == 2 and ots[0] != "r": - continue # EVEX.z must be zero for memory destination - if evexsae and (vecsize not in (0, 512) or has_memory): - continue # SAE/ER only works with 512 bit width and no memory - - spec_opcode = opcode - if prefix[1]: - spec_opcode = spec_opcode._replace(prefix=prefix[1]) - if opsize == 64 and "D64" not in desc.flags and "F64" not in desc.flags: - spec_opcode = spec_opcode._replace(rexw="1") - if vecsize == 512: - spec_opcode = spec_opcode._replace(vexl="2") - if vecsize == 256: - spec_opcode = spec_opcode._replace(vexl="1") - if vecsize == 128: - spec_opcode = spec_opcode._replace(vexl="0") - if spec_opcode.vexl == "IG": - spec_opcode = spec_opcode._replace(vexl="0") - if ENCODINGS[desc.encoding].modrm_idx: - modrm = ("m" if has_memory else "r",) + spec_opcode.modrm[1:] - spec_opcode = spec_opcode._replace(modrm=modrm) - if ENCODINGS[desc.encoding].modrm or None not in opcode.modrm: - assert spec_opcode.modrm[0] in ("r", "m") - - evexbcst = "b" in ots - evexdisp8scale = 0 - if spec_opcode.vex == 2 and has_memory: - if not evexbcst: - op = desc.operands[ENCODINGS[desc.encoding].modrm_idx^3] - size = op.abssize(opsize//8, vecsize//8) - evexdisp8scale = size.bit_length() - 1 - elif "BCST16" in desc.flags: - evexdisp8scale = 1 - else: - evexdisp8scale = 2 if spec_opcode.rexw != "1" else 3 - - # Construct mnemonic name - name = prefix[0] + mnem_name - - # Transform MOV_G2X/X2G into MOVD/MOVQ_G2X/X2G. This isn't done for - # VEX for historical reasons and there's no reason to break - # backwards compatibility. This enables EVEX->VEX fallback. - if desc.mnemonic in ("EVX_MOV_G2X", "EVX_MOV_X2G"): - name = name[:-4] + "DQ"[opsize == 64] + name[-4:] - prepend_opsize, opsize = False, 0 - # For VMOVD with memory operand, there's no need to be explicit - # about G2X/X2G, as there's no alternative. For VMOVQ, another - # opcode exists, so keep G2X/X2G there for distinguishing. - if name in ("VMOVD_G2X", "VMOVD_X2G") and has_memory: - name = name.replace("_G2X", "").replace("_X2G", "") - # PEXTR/PBROADCAST/PINSR are stored without size suffix in the table - # to avoid having different tables for 32/64 bit mode due to EVEX.W - # being ignored in 32-bit mode. Add suffix here. - if desc.mnemonic == "EVX_PEXTR": - name += " BW D Q"[desc.operands[0].abssize(opsize//8, vecsize//8)] - prepend_opsize, opsize = False, 0 - if desc.mnemonic == "EVX_PBROADCAST": - name += " BW D Q"[desc.operands[1].abssize(opsize//8, vecsize//8)] - name += "_GP" - prepend_opsize, opsize = False, 0 - if desc.mnemonic == "EVX_PINSR": - name += " BW D Q"[desc.operands[2].abssize(opsize//8, vecsize//8)] - prepend_opsize, opsize = False, 0 - - if prepend_opsize and not ("D64" in desc.flags and opsize == 64): - name += f"_{opsize}"[name[-1] not in "0123456789":] - if prepend_vecsize: - name += f"_{vecsize}"[name[-1] not in "0123456789":] - for ot, op in zip(ots, desc.operands): - name += ot.replace("o", "") - if separate_opsize: - name += f"{op.abssize(opsize//8, vecsize//8)*8}" - if "VSIB" not in desc.flags: - # VSIB implies non-zero mask register, so suffix is not required - name += ["", "_mask", "_maskz"][evexmask] - name += ["", "_sae", "_er"][evexsae] - variant = EncodeVariant(spec_opcode, desc, evexbcst, evexmask, evexsae, evexdisp8scale) - mnemonics[name, opsize, ots].append(variant) - altname = { - "C_EX16": "CBW", "C_EX32": "CWDE", "C_EX64": "CDQE", - "C_SEP16": "CWD", "C_SEP32": "CDQ", "C_SEP64": "CQO", - "CMPXCHGD32m": "CMPXCHG8Bm", "CMPXCHGD64m": "CMPXCHG16Bm", - }.get(name) - if altname: - mnemonics[altname, opsize, ots].append(variant) - if "ENC_CC_BEGIN" in desc.flags: - # Replace last "O" with "cc" - ccname = "cc".join(name.rsplit("O", 1)) - ccvariant = variant._replace(flexcc=True) - mnemonics[ccname, opsize, ots].append(ccvariant) - - for (mnem, opsize, ots), all_variants in mnemonics.items(): - dedup = OrderedDict() - for i, variant in enumerate(all_variants): - PRIO = ["O", "OA", "AO", "AM", "MA", "IA", "OI"] - enc_prio = PRIO.index(variant.desc.encoding) if variant.desc.encoding in PRIO else len(PRIO) - unique = 0 if variant.desc.encoding != "S" else i - # Prefer VEX over EVEX for shorter encoding - key = variant.desc.imm_size(opsize//8), variant.opcode.vex, enc_prio, unique - if key not in dedup: - dedup[key] = variant - variants = [dedup[k] for k in sorted(dedup.keys())] - if len(variants) > 1 and any(v.opcode.vex for v in variants): - # Case 1: VEX -> EVEX promotion (AVX-512, APX) - # Case 2: legacy -> EVEX promotion (APX) - # In any case, there should be exactly one EVEX opcode. - if len(variants) != 2: - raise Exception(f"VEX/EVEX mnemonic with more than two encodings {mnem} {opcode}") - if variants[0].opcode.vex == 2 or variants[1].opcode.vex != 2: - raise Exception(f"EVEX mnemonic not with non-EVEX pair {mnem} {opcode} {variants}") - no_evex, evex = variants[0], variants[1] - - # Make sure that for promotions, only minor things vary. - # REX.W is special, EVEX might mandate W1 while VEX mandates W0/WIG. - # Technically ok: IG -> IG/IG -> 0/0 -> IG/0 -> 0/1 -> IG/1 -> 1 - # rexwdowngrade = (no_evex.opcode.rexw is None or - # no_evex.opcode.rexw == evex.opcode.rexw) - # - # However, other encoders always use W0 in case of WIG for VEX, and - # that's probably most beneficial... so: - # Possible downgrades: IG -> IG/IG -> 0/0 -> IG/0 -> 0/1 -> 1 - # This affects quite a few instructions, so we use an extra bit to - # flip EVEX.W to VEX.W. - - if (no_evex.opcode.prefix != evex.opcode.prefix or - no_evex.opcode.escape != evex.opcode.escape or - no_evex.opcode.opc != evex.opcode.opc or - # reg/mem doesn't matter, it's already fixed in the mnemonic - no_evex.opcode.modrm[1:] != evex.opcode.modrm[1:] or - no_evex.opcode.vexl != evex.opcode.vexl or - # we don't check rexw_flip here, we can always handle it - no_evex.desc.encoding != evex.desc.encoding or - no_evex.desc.operands != evex.desc.operands): - print(mnem, no_evex) - print(mnem, evex) - # Should not happen. - raise Exception("cannot downgrade EVEX?") - else: - rexw_flip = (no_evex.opcode.rexw == "1") != (evex.opcode.rexw == "1") - variants = [evex._replace(downgrade=1 if not rexw_flip else 2)] - mnemonics[mnem, opsize, ots] = variants - - return dict(mnemonics) - -def encode_table(entries, args): - mnemonics = encode_mnems(entries) - mnemonics["NOP", 0, ""] = [EncodeVariant(Opcode.parse("90"), InstrDesc.parse("NP - - - - NOP"))] - mnem_map = {} - alt_table = [0] # first entry is unused - for (mnem, opsize, ots), variants in mnemonics.items(): - supports_high_regs = [] - if variants[0][1].mnemonic in ("MOVSX", "MOVZX") or opsize == 8: - # Should be the same for all variants - desc = variants[0][1] - for i, (ot, op) in enumerate(zip(ots, desc.operands)): - if ot == "r" and op.kind == "GP" and op.abssize(opsize//8) == 1: - supports_high_regs.append(i) - - alt_indices = [i + len(alt_table) for i in range(len(variants) - 1)] + [0] - - if variants[0][1].encoding == "D": - assert 1 <= len(variants) <= 2 - # We handle jump (jmp/jcc) alternatives in code to support Jcc. - if len(variants) > 1: - assert variants[0][1].mnemonic[:1] == "J" - variants = variants[:1] - alt_indices = [0xff] - - enc_opcs = [] - for alt, variant in zip(alt_indices, variants): - opcode, desc = variant.opcode, variant.desc - encoding = ENCODINGS[desc.encoding] - opc_i = opcode.opc - if None not in opcode.modrm: - opc_i |= 0xc000 | opcode.modrm[1] << 11 | opcode.modrm[2] << 8 - elif opcode.modrm[1] is not None: - opc_i |= opcode.modrm[1] << 8 - if opcode.modrm == ("m", None, 4): - opc_i |= 0x2000000000 # FORCE_SIB - if not opcode.vex: - assert opcode.escape < 4 - opc_i |= opcode.escape * 0x10000 - opc_i |= 0x80000 if opcode.prefix == "66" or opsize == 16 else 0 - opc_i |= 0x100000 if opcode.prefix == "F2" else 0 - opc_i |= 0x200000 if opcode.prefix == "F3" else 0 - else: - assert opcode.escape < 8 - opc_i |= opcode.escape * 0x10000 - if opcode.prefix == "66" or opsize == 16: - assert opcode.prefix not in ("F2", "F3") - opc_i |= 0x100000 - if opcode.prefix == "F3": - opc_i |= 0x200000 - elif opcode.prefix == "F2": - opc_i |= 0x300000 - opc_i |= 0x400000 if opcode.rexw == "1" else 0 - if opcode.prefix == "LOCK": - opc_i |= 0x800000 - elif opcode.vex == 1: - opc_i |= 0x1000000 + 0x800000 * int(opcode.vexl or 0) - elif opcode.vex == 2: - opc_i |= 0x2000000 - # L'L encodes SAE rounding mode otherwise - if not variant.evexsae: - opc_i |= 0x800000 * int(opcode.vexl or 0) - assert not (variant.evexsae and variant.evexbcst) - opc_i |= 0x4000000 if variant.evexsae or variant.evexbcst else 0 - opc_i |= 0x8000000 if "VSIB" in desc.flags else 0 - opc_i |= 0x1000000000 if variant.evexmask == 2 else 0 - opc_i |= 0x4000000000 if variant.downgrade in (1, 2) else 0 - opc_i |= 0x40000000000 if variant.downgrade == 2 else 0 - opc_i |= 0x8000000000 * variant.evexdisp8scale - if alt >= 0x100: - raise Exception("encode alternate bits exhausted") - opc_i |= sum(1 << i for i in supports_high_regs) << 45 - if encoding.imm_control >= 3: - opc_i |= desc.imm_size(opsize//8) << 47 - elif encoding.imm_control in (1, 2): - # Must be an arbitrary non-zero value, replaced by address size - # for imm_ctl=2 and zero for imm_ctl=1 (constant 1). - opc_i |= 1 << 47 - - enc_encoding = desc.encoding - if desc.encoding != "I" and desc.encoding.endswith("I"): - enc_encoding = desc.encoding[:-1] - elif desc.encoding == "IA": - enc_encoding = "A" - opc_i |= ["NP", "M", "R", "M1", "MC", "MR", "RM", "RMA", "MRC", - "AM", "MA", "I", "O", "OA", "S", "A", "D", "FD", "TD", "IM", - "RVM", "RVMR", "RMV", "VM", "MVR", "MRV", - ].index(enc_encoding) << 51 - opc_i |= alt << 56 - enc_opcs.append(opc_i) - mnem_map[f"FE_{mnem}"] = enc_opcs[0] - alt_table += enc_opcs[1:] - - mnem_tab = "".join(f"#define {m} {v:#x}\n" for m, v in mnem_map.items()) - alt_tab = "".join(f"[{i}] = {v:#x},\n" for i, v in enumerate(alt_table)) - return mnem_tab, alt_tab - -def unique(it): - vals = set(it) - if len(vals) != 1: - raise Exception(f"multiple values: {vals}") - return next(iter(vals)) - -def encode2_gen_legacy(variant: EncodeVariant, opsize: int, supports_high_regs: list[int], imm_expr: str, imm_size_expr: str, has_idx: bool) -> str: - opcode = variant.opcode - desc = variant.desc - flags = ENCODINGS[variant.desc.encoding] - code = "" - - rex_expr = [] if opcode.rexw != "1" else ["0x48"] - rex_values = set() - for i in supports_high_regs: - rex_expr.append(f"(op_reg_idx(op{i}) >= 4 && op_reg_idx(op{i}) <= 15?0x40:0)") - rex_values.add(0x40) - has_modreg_rex = False - if flags.modreg_idx: - has_modreg_rex = desc.operands[flags.modreg_idx^3].kind in ("GP", "XMM", "CR", "DR") - if flags.modrm_idx: - if opcode.modrm[0] == "m": - rex_modreg_op = f"op_reg_idx(op{flags.modreg_idx^3})" if has_modreg_rex else "0" - rex_expr.append(f"enc_rex_mem(op{flags.modrm_idx^3}, {rex_modreg_op})") - rex_values |= {0x41, 0x42, 0x44} - elif desc.operands[flags.modrm_idx^3].kind in ("GP", "XMM"): - rex_expr.append(f"(op_reg_idx(op{flags.modrm_idx^3})&8?0x1:0)") - rex_values.add(0x41) - if has_modreg_rex: - rex_expr.append(f"(op_reg_idx(op{flags.modreg_idx^3})&8?0x4:0)") - rex_values.add(0x44) - elif has_modreg_rex: # O encoding - rex_expr.append(f"(op_reg_idx(op{flags.modreg_idx^3})&8?0x1:0)") - rex_values.add(0x41) - - if rex_expr: - code += f" unsigned rex = {'|'.join(rex_expr) or '0'};\n" - for i in supports_high_regs: - code += f" if (rex && op_reg_gph(op{i})) return 0;\n" - - if not has_idx: - code += " unsigned idx = 0;\n" - if opcode.prefix == "LOCK": - code += f" buf[idx++] = 0xF0;\n" - if opsize == 16 or opcode.prefix == "66": - code += " buf[idx++] = 0x66;\n" - if opcode.prefix in ("F2", "F3"): - code += f" buf[idx++] = 0x{opcode.prefix};\n" - if opcode.rexw == "1": - code += f" buf[idx++] = rex;\n" - elif len(rex_values) == 1: - code += f" buf[idx] = {next(iter(rex_values))};\n idx += rex != 0;\n" - elif len(rex_values) == 2: - code += f" buf[idx] = 0x40|rex;\n idx += rex != 0;\n" - elif rex_expr: # memory, multiplication is expensive - code += f" if (rex) buf[idx++] = 0x40|rex;\n" - if opcode.escape: - code += f" buf[idx++] = 0x0F;\n" - if opcode.escape == 2: - code += f" buf[idx++] = 0x38;\n" - elif opcode.escape == 3: - code += f" buf[idx++] = 0x3A;\n" - opcodestr = f"{opcode.opc:#x}" + ("|(flags>>16)" if variant.flexcc else "") - code += f" buf[idx++] = {opcodestr};\n" - if None not in opcode.modrm: - opcext = 0xc0 | opcode.modrm[1] << 3 | opcode.modrm[2] - code += f" buf[idx++] = {opcext:#x};\n" - - if flags.modrm: - if flags.modreg_idx: - modreg = f"op_reg_idx(op{flags.modreg_idx^3})" - else: - modreg = opcode.modrm[1] or 0 - if opcode.modrm[0] == "m": - assert "VSIB" not in desc.flags - assert opcode.modrm[2] is None - modrm = f"op{flags.modrm_idx^3}" - code += f" idx = enc_mem(buf+idx, idx+{imm_size_expr}, {modrm}, {modreg}, 0, 0);\n" - code += f" if (!idx) return 0;\n idx -= {imm_size_expr};\n" - else: - if flags.modrm_idx: - modrm = f"op_reg_idx(op{flags.modrm_idx^3})" - else: - modrm = f"{opcode.modrm[2] or 0}" - code += f" buf[idx++] = 0xC0|({modreg}<<3)|({modrm}&7);\n" - elif flags.modrm_idx: - code += f" buf[idx-1] |= op_reg_idx(op{flags.modrm_idx^3}) & 7;\n" - if flags.imm_control >= 2: - if flags.imm_control == 6: - imm_expr += " - idx" - code += f" enc_imm(buf+idx, {imm_expr}, {imm_size_expr});\n" - code += f" return idx + {imm_size_expr};\n" - else: - code += f" return idx;\n" - return code - -def encode2_gen_vex(variant: EncodeVariant, imm_expr: str, imm_size_expr: str, has_idx: bool) -> str: - opcode = variant.opcode - flags = ENCODINGS[variant.desc.encoding] - code = "" - - helperopc = opcode.opc << 16 - helperopc |= ["NP", "66", "F3", "F2"].index(opcode.prefix) << 8 - helperopc |= 0x8000 if opcode.rexw == "1" else 0 - if not variant.evexsae: - # ER: L'L encodes rounding mode for SAE - helperopc |= 0x0020 * int(opcode.vexl or 0) # EVEX.L'L - helperopc |= opcode.escape << 10 - helperopc |= 0x10 if variant.evexsae or variant.evexbcst else 0 # EVEX.b - helperopc |= 0x80 if variant.evexmask == 2 else 0 # EVEX.z - helperopc |= 0x1000000 if variant.downgrade in (1, 2) else 0 - helperopc |= 0x2000000 if variant.downgrade == 2 else 0 - helperopc = f"{helperopc:#x}" - if variant.flexcc: - helperopc += "|(flags&FE_CC_MASK)" - if variant.evexsae == 2: - helperopc += "|(flags&FE_RC_MASK)" - if variant.evexmask: - code += " if (!op_reg_idx(opmask)) return 0;\n" - helperopc += "|(op_reg_idx(opmask)&7)" - - if flags.modreg_idx: - modreg = f"op_reg_idx(op{flags.modreg_idx^3})" - else: - modreg = opcode.modrm[1] or 0 - vexop = f"op_reg_idx(op{flags.vexreg_idx^3})" if flags.vexreg_idx else 0 - is_memory = opcode.modrm[0] == "m" - if not flags.modrm and opcode.modrm == (None, None, None): - # No ModRM, prefix only (VZEROUPPER/VZEROALL) - assert opcode.vex == 1 - assert not has_idx - helperfn, helperargs = "enc_vex_common", f"0, 0, 0, 0" - elif opcode.modrm[0] == "m": - vsib = "VSIB" in variant.desc.flags - helperfn = "enc" + ["", "_vex", "_evex"][opcode.vex] + ["_mem", "_vsib"][vsib] - assert opcode.modrm[2] in (None, 4) - forcesib = 1 if opcode.modrm[2] == 4 else 0 # AMX - modrm = f"op{flags.modrm_idx^3}" - ripoff = imm_size_expr + ("" if not has_idx else "+idx") - helperargs = (f"{modrm}, {modreg}, {vexop}, {ripoff}, " + - f"{forcesib}, {variant.evexdisp8scale}") - else: - if flags.modrm_idx: - modrm = f"op_reg_idx(op{flags.modrm_idx^3})" - else: - modrm = f"{opcode.modrm[2] or 0}" - suffix = "_reg" - if (opcode.vex == 2 and flags.modrm_idx and - variant.desc.operands[flags.modrm_idx^3].kind == "XMM"): - suffix = "_xmm" - helperfn = "enc" + ["", "_vex", "_evex"][opcode.vex] + suffix - helperargs = f"{modrm}, {modreg}, {vexop}" - bufidx = "buf" if not has_idx else "buf+idx" - helpercall = f"{helperfn}({bufidx}, {helperopc}, {helperargs})" - if flags.imm_control >= 2: - assert flags.imm_control < 6, "jmp with VEX/EVEX?" - if is_memory: - code += f" unsigned instlen = {helpercall};\n" - code += f" if (instlen) enc_imm(buf+instlen-{imm_size_expr}, {imm_expr}, {imm_size_expr});\n" - code += f" return instlen;\n" - else: - code += f" unsigned vexoff = {helpercall};\n" - code += f" enc_imm({bufidx}+vexoff, {imm_expr}, {imm_size_expr});\n" - code += f" return vexoff ? vexoff+{imm_size_expr}{'+idx' if has_idx else ''} : 0;\n" - elif has_idx and not is_memory: - code += f" unsigned vexoff = {helpercall};\n" - code += f" return vexoff ? vexoff+idx : 0;\n" - else: - code += f" return {helpercall};\n" - return code - -def encode2_table(entries, args): - mnemonics = encode_mnems(entries) - - enc_decls, enc_code = "", "" - for (mnem, opsize, ots), variants in mnemonics.items(): - max_imm_size = max(v.desc.imm_size(opsize//8) for v in variants) - - supports_high_regs = [] - if variants[0].desc.mnemonic in ("MOVSX", "MOVZX") or opsize == 8: - # Should be the same for all variants - for i, (ot, op) in enumerate(zip(ots, variants[0].desc.operands)): - if ot == "r" and op.kind == "GP" and op.abssize(opsize//8) == 1: - supports_high_regs.append(i) - supports_vsib = unique("VSIB" in v.desc.flags for v in variants) - opkinds = unique(tuple(op.kind for op in v.desc.operands) for v in variants) - evexmask = unique(v.evexmask for v in variants) - evexsae = unique(v.evexsae for v in variants) - - OPKIND_LUT = {"FPU": "ST", "SEG": "SREG", "MMX": "MM"} - reg_tys = [OPKIND_LUT.get(opkind, opkind) for opkind in opkinds] - - fnname = f"fe64_{mnem}" - op_tys = [{ - "i": f"int{max_imm_size*8 if max_imm_size != 3 else 32}_t", - "a": "uintptr_t", - "r": f"FeReg{reg_ty if i not in supports_high_regs else 'GPLH'}", - "k": "FeRegMASK", - "m": "FeMem" if not supports_vsib else "FeMemV", - "b": "FeMem", - "o": "const void*", - }[ot] for i, (ot, reg_ty) in enumerate(zip(ots, reg_tys))] - fn_opargs = ", FeRegMASK opmask" if evexmask else "" - fn_opargs += "".join(f", {ty} op{i}" for i, ty in enumerate(op_tys)) - fn_sig = f"unsigned ({fnname})(uint8_t* buf, int flags{fn_opargs})" - enc_decls += f"{fn_sig};\n" - if supports_high_regs: - enc_decls += f"#define fe64_{mnem}(buf, flags" - enc_decls += "".join(f", op{i}" for i in range(len(op_tys))) - enc_decls += f") {fnname}(buf, flags" - enc_decls += "".join(f", FE_MAKE_GPLH(op{i})" if i in supports_high_regs else f", op{i}" for i in range(len(op_tys))) - enc_decls += f")\n" - - code = f"{fn_sig} {{\n" - - has_memory = unique(v.opcode.modrm[0] == "m" for v in variants) - has_useg = unique("USEG" in v.desc.flags for v in variants) - has_u67 = unique("U67" in v.desc.flags for v in variants) - if has_memory or has_useg: - # segment override without addrsize override shouldn't happen - assert has_memory or has_u67 - code += f" unsigned idx = UNLIKELY(flags & (FE_SEG_MASK|FE_ADDR32)) ? enc_seg67(buf, flags) : 0;\n" - elif has_u67: - # STOS, SCAS, JCXZ, LOOP, LOOPcc - code += f" unsigned idx = UNLIKELY(flags & FE_ADDR32) ? (*buf=0x67, 1) : 0;\n" - else: - code += " (void) flags;\n" - - # indicate whether an idx variable exists - has_idx = has_memory or has_useg or has_u67 - - for i, variant in enumerate(variants): - opcode, desc = variant.opcode, variant.desc - flags = ENCODINGS[desc.encoding] - - conds = [] - # Select usable encoding. - if desc.encoding == "S": - # Segment encoding is weird. - conds.append(f"op_reg_idx(op0)=={(opcode.opc>>3)&0x7:#x}") - if desc.mnemonic == "XCHG_NOP" and opsize == 32: - # XCHG eax, eax must not be encoded as 90 -- that'd be NOP. - conds.append(f"!(op_reg_idx(op0)==0&&op_reg_idx(op1)==0)") - if flags.vexreg_idx and not opcode.vex: # vexreg w/o vex is zeroreg - conds.append(f"op_reg_idx(op{flags.vexreg_idx^3})=={flags.zeroreg_val}") - - imm_size = desc.imm_size(opsize//8) - imm_size_expr = f"{imm_size}" - imm_expr = f"(int64_t) op{flags.imm_idx^3}" - if flags.imm_control == 1: - conds.append(f"op{flags.imm_idx^3} == 1") - elif flags.imm_control == 2: - imm_size_expr = "(flags & FE_ADDR32 ? 4 : 8)" - imm_expr = f"(int64_t) (flags & FE_ADDR32 ? (int32_t) {imm_expr} : {imm_expr})" - elif flags.imm_control == 3: - imm_expr = f"op_reg_idx(op{flags.imm_idx^3}) << 4" - code += f" if (op_reg_idx(op{flags.imm_idx^3}) >= 16) return 0;\n" - elif flags.imm_control == 4 and imm_size == 3: # ENTER - code += f" if ((uint32_t) op{flags.imm_idx^3} >= 0x1000000) return 0;\n" - elif flags.imm_control == 4 and imm_size < max_imm_size: - conds.append(f"op_imm_n({imm_expr}, {imm_size})") - elif flags.imm_control == 6: - imm_expr = f"{imm_expr} - (int64_t) buf - {imm_size}" - if i != len(variants) - 1: # only Jcc+JMP - conds.append(f"!(flags & FE_JMPL)") - # assume one-byte opcode without escape/prefixes - conds.append(f"op_imm_n({imm_expr}-1, {imm_size})") - - if conds: - code += f" if ({'&&'.join(conds)}) {{\n" - - if opcode.vex: - code += encode2_gen_vex(variant, imm_expr, imm_size_expr, has_idx) - else: - code += encode2_gen_legacy(variant, opsize, supports_high_regs, imm_expr, imm_size_expr, has_idx) - - if conds: - code += " }\n" - else: - break - else: - code += " return 0;\n" - - enc_code += code + "}\n" - - return enc_decls, enc_code - - -if __name__ == "__main__": - generators = { - "decode": decode_table, - "encode": encode_table, - "encode2": encode2_table, - } - - parser = argparse.ArgumentParser() - parser.add_argument("--32", dest="modes", action="append_const", const=32) - parser.add_argument("--64", dest="modes", action="append_const", const=64) - parser.add_argument("--with-undoc", action="store_true") - parser.add_argument("--stats", action="store_true") - parser.add_argument("mode", choices=generators.keys()) - parser.add_argument("table", type=argparse.FileType('r')) - parser.add_argument("out_public", type=argparse.FileType('w')) - parser.add_argument("out_private", type=argparse.FileType('w')) - args = parser.parse_args() - - entries = [] - for line in args.table.read().splitlines(): - if not line or line[0] == "#": continue - line, weak = (line, False) if line[0] != "*" else (line[1:], True) - opcode_string, desc_string = tuple(line.split(maxsplit=1)) - opcode, desc = Opcode.parse(opcode_string), InstrDesc.parse(desc_string) - verifyOpcodeDesc(opcode, desc) - if "UNDOC" not in desc.flags or args.with_undoc: - entries.append((weak, opcode, desc)) - - res_public, res_private = generators[args.mode](entries, args) - args.out_public.write(res_public) - args.out_private.write(res_private) diff --git a/third_party/raw_pdb/.gitignore b/third_party/raw_pdb/.gitignore deleted file mode 100644 index 7e1dd7f..0000000 --- a/third_party/raw_pdb/.gitignore +++ /dev/null @@ -1,431 +0,0 @@ -# CLion -.idea/ - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates -*.env - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ - -[Dd]ebug/x64/ -[Dd]ebugPublic/x64/ -[Rr]elease/x64/ -[Rr]eleases/x64/ -bin/x64/ -obj/x64/ - -[Dd]ebug/x86/ -[Dd]ebugPublic/x86/ -[Rr]elease/x86/ -[Rr]eleases/x86/ -bin/x86/ -obj/x86/ - -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -[Aa][Rr][Mm]64[Ee][Cc]/ -bld/ -[Oo]bj/ -[Oo]ut/ -[Ll]og/ -[Ll]ogs/ - -# Build results on 'Bin' directories -**/[Bb]in/* -# Uncomment if you have tasks that rely on *.refresh files to move binaries -# (https://github.com/github/gitignore/pull/3736) -#!**/[Bb]in/*.refresh - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* -*.trx - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Approval Tests result files -*.received.* - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.idb -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -# but not Directory.Build.rsp, as it configures directory-level build defaults -!Directory.Build.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -**/.paket/paket.exe -paket-files/ - -# FAKE - F# Make -**/.fake/ - -# CodeRush personal settings -**/.cr/personal - -# Python Tools for Visual Studio (PTVS) -**/__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -#tools/** -#!tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog -MSBuild_Logs/ - -# AWS SAM Build and Temporary Artifacts folder -.aws-sam - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -**/.mfractor/ - -# Local History for Visual Studio -**/.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -**/.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp diff --git a/third_party/raw_pdb/CMakeLists.txt b/third_party/raw_pdb/CMakeLists.txt deleted file mode 100644 index cc22ad5..0000000 --- a/third_party/raw_pdb/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -cmake_minimum_required(VERSION 3.16) - -project(raw_pdb) - -set(CMAKE_CXX_STANDARD 11) - -set_property(GLOBAL PROPERTY USE_FOLDERS ON) - -add_subdirectory(src) \ No newline at end of file diff --git a/third_party/raw_pdb/LICENSE b/third_party/raw_pdb/LICENSE deleted file mode 100644 index d3fe23f..0000000 --- a/third_party/raw_pdb/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSD 2-Clause License - -Copyright 2011-2022, Molecular Matters GmbH -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/raw_pdb/README.md b/third_party/raw_pdb/README.md deleted file mode 100644 index d275d5e..0000000 --- a/third_party/raw_pdb/README.md +++ /dev/null @@ -1,190 +0,0 @@ -# RawPDB - -**RawPDB** is a C++11 library that directly reads Microsoft Program DataBase PDB files. The code is extracted almost directly from Live++ 2, a battle-tested hot-reload tool for C++. - -## Design - -**RawPDB** gives you direct access to the stream data contained in a PDB file. It does not attempt to offer abstractions for iterating symbols, translation units, contributions, etc. - -Building a high-level abstraction over the provided low-level data is an ill-fated attempt that can never really be performant for everybody, because different tools like debuggers, hot-reload tools (e.g. Live++), profilers (e.g. Superluminal), need to perform different queries against the stored data. - -We therefore believe the best solution is to offer direct access to the underlying data, with applications bringing that data into their own structures. - -## Goal - -Eventually, we want **RawPDB** to become the de-facto replacement of Microsoft's DIA SDK that most C++ developers (have to) use. - -## Features - -* Fast - **RawPDB** works directly with memory-mapped data, so only the data from the streams you touch affect performance. It is orders of magnitudes faster than the DIA SDK, and faster than comparable LLVM code -* Scalable - **RawPDB's** API gives you access to individual streams that can all be read concurrently in a trivial fashion, since all returned data structures are immutable. There are no locks or waits anywhere inside the library -* Lightweight - **RawPDB** is small and compiles in roughly 1 second -* Allocation-friendly - **RawPDB** performs only a few allocations, and those can be overridden easily by changing the underlying macro -* No STL - **RawPDB** does not need any STL containers or algorithms -* No exceptions - **RawPDB** does not use exceptions -* No RTTI - **RawPDB** does not need RTTI or use class hierarchies -* High-quality code - **RawPDB** compiles clean under -Wall - -## Building - -The code compiles clean under Visual Studio 2015, 2017, 2019, or 2022. A solution for Visual Studio 2019 is included. - -## Performance - -Running the **Symbols** and **Contributions** examples on a 1GiB PDB yields the following output: - -
-Opening PDB file C:\Development\llvm-project\build\tools\clang\unittests\Tooling\RelWithDebInfo\ToolingTests.pdb
-
-Running example "Symbols"
-| Reading image section stream
-| ---> done in 0.066ms
-| Reading module info stream
-| ---> done in 0.562ms
-| Reading symbol record stream
-| ---> done in 25.185ms
-| Reading public symbol stream
-| ---> done in 1.133ms
-| Storing public symbols
-| ---> done in 46.171ms (212023 elements)
-| Reading global symbol stream
-| ---> done in 1.381ms
-| Storing global symbols
-| ---> done in 12.769ms (448957 elements)
-| Storing symbols from modules
-| ---> done in 145.849ms (2243 elements)
----> done in 233.694ms (539611 elements)
-
- -
-Opening PDB file C:\Development\llvm-project\build\tools\clang\unittests\Tooling\RelWithDebInfo\ToolingTests.pdb
-
-Running example "Contributions"
-| Reading image section stream
-| ---> done in 0.066ms
-| Reading module info stream
-| ---> done in 0.594ms
-| Reading section contribution stream
-| ---> done in 9.839ms
-| Storing contributions
-| ---> done in 67.346ms (630924 elements)
-| std::sort contributions
-| ---> done in 19.218ms
----> done in 97.283ms
-20 largest contributions:
-1: 1896496 bytes from LLVMAMDGPUCodeGen.dir\RelWithDebInfo\AMDGPUInstructionSelector.obj
-2: 1700720 bytes from LLVMHexagonCodeGen.dir\RelWithDebInfo\HexagonInstrInfo.obj
-3: 1536470 bytes from LLVMRISCVCodeGen.dir\RelWithDebInfo\RISCVISelDAGToDAG.obj
-4: 1441408 bytes from LLVMAArch64CodeGen.dir\RelWithDebInfo\AArch64InstructionSelector.obj
-5: 1187048 bytes from LLVMRISCVCodeGen.dir\RelWithDebInfo\RISCVInstructionSelector.obj
-6: 1026504 bytes from LLVMARMCodeGen.dir\RelWithDebInfo\ARMInstructionSelector.obj
-7: 952080 bytes from LLVMAMDGPUDesc.dir\RelWithDebInfo\AMDGPUMCTargetDesc.obj
-8: 849888 bytes from LLVMX86Desc.dir\RelWithDebInfo\X86MCTargetDesc.obj
-9: 712176 bytes from LLVMHexagonCodeGen.dir\RelWithDebInfo\HexagonInstrInfo.obj
-10: 679035 bytes from LLVMX86CodeGen.dir\RelWithDebInfo\X86ISelDAGToDAG.obj
-11: 525174 bytes from LLVMAMDGPUDesc.dir\RelWithDebInfo\AMDGPUMCTargetDesc.obj
-12: 523035 bytes from * Linker *
-13: 519312 bytes from LLVMRISCVDesc.dir\RelWithDebInfo\RISCVMCTargetDesc.obj
-14: 512496 bytes from LLVMVEDesc.dir\RelWithDebInfo\VEMCTargetDesc.obj
-15: 498768 bytes from LLVMX86CodeGen.dir\RelWithDebInfo\X86InstructionSelector.obj
-16: 483528 bytes from LLVMMipsCodeGen.dir\RelWithDebInfo\MipsInstructionSelector.obj
-17: 449472 bytes from LLVMAMDGPUCodeGen.dir\RelWithDebInfo\AMDGPUISelDAGToDAG.obj
-18: 444246 bytes from C:\Development\llvm-project\build\tools\clang\lib\Basic\obj.clangBasic.dir\RelWithDebInfo\DiagnosticIDs.obj
-19: 371584 bytes from LLVMAArch64CodeGen.dir\RelWithDebInfo\AArch64ISelDAGToDAG.obj
-20: 370272 bytes from LLVMNVPTXDesc.dir\RelWithDebInfo\NVPTXMCTargetDesc.obj
-
- -This is at least an order of magnitude faster than DIA, even though the example code is completely serial and uses std::vector, std::string, and std::sort, which are used for illustration purposes only. - -When reading streams in a concurrent fashion, you will most likely be limited by the speed at which the OS can bring the data into your process. - -Running the **Lines** example on a 1.37 GiB PDB yields the following output: - -
-
-Opening PDB file C:\pdb-test-files\clang-debug.pdb
-Version 20000404, signature 1658696914, age 1, GUID 563dd8f1-f32b-459b-8c2beae0e70bc19b
-
-Running example "Lines"
-| Reading image section stream
-| ---> done in 0.313ms
-| Reading module info stream
-| ---> done in 0.403ms
-| Reading names stream
-| ---> done in 0.126ms
-| Storing lines from modules
-| ---> done in 306.720ms (1847 elements)
-| std::sort sections
-| ---> done in 103.090ms (4023680 elements)
-
-
- -## Supported streams - -**RawPDB** gives you access to the following PDB stream data: - -* DBI stream data - * Public symbols - * Global symbols - * Modules - * Module symbols - * Module lines (C13 line information) - * Image sections - * Info stream - * "/names" stream - * Section contributions - * Source files - -* IPI stream data - -* TPI stream data - -Furthermore, PDBs linked using /DEBUG:FASTLINK are not supported. These PDBs do not contain much information, since private symbol information is distributed among object files and library files. - -## Documentation - -If you are unfamiliar with the basic structure of a PDB file, the LLVM documentation serves as a good introduction. - -Consult the example code to see how to read and parse the PDB streams. - -## Directory structure - -* bin: contains final binary output files (.exe and .pdb) -* build: contains Visual Studio 2019 solution and project files -* lib: contains the RawPDB library output files (.lib and .pdb) -* src: contains the RawPDB source code, as well as example code -* temp: contains intermediate build artefacts - -## Examples - -### Symbols (ExampleSymbols.cpp) - -A basic example that shows how to load symbols from public, global, and module streams. - -### Contributions (ExampleContributions.cpp) - -A basic example that shows how to load contributions, sort them by size, and output the 20 largest ones along with the object file they originated from. - -### Function symbols (ExampleFunctionSymbols.cpp) - -An example intended for profiler developers that shows how to enumerate all function symbols and retrieve or compute their code size. - -### Function variables (ExampleFunctionVariables.cpp) - -An example intended for debugger developers that shows how to enumerate all function records needed for displaying function variables. - -### Lines (ExampleLines.cpp) - -An example that shows to how to load line information for all modules. - -### Types (ExampleTypes.cpp) - -An example that prints all type records. - -### PDBSize (ExamplePDBSize.cpp) - -An example that could serve as a starting point for people wanting to investigate and optimize the size of their PDBs. - -## Sponsoring or supporting RawPDB - -We have chosen a very liberal license to let **RawPDB** be used in as many scenarios as possible, including commercial applications. If you would like to support its development, consider licensing Live++ instead. Not only do you give something back, but get a great productivity enhancement on top! diff --git a/third_party/raw_pdb/raw_pdb.natvis b/third_party/raw_pdb/raw_pdb.natvis deleted file mode 100644 index e285ad0..0000000 --- a/third_party/raw_pdb/raw_pdb.natvis +++ /dev/null @@ -1,12 +0,0 @@ - - - - {{ size={m_length} }} - - - m_length - m_data - - - - diff --git a/third_party/raw_pdb/src/CMakeLists.txt b/third_party/raw_pdb/src/CMakeLists.txt deleted file mode 100644 index fdbe1e0..0000000 --- a/third_party/raw_pdb/src/CMakeLists.txt +++ /dev/null @@ -1,112 +0,0 @@ -set(SOURCES - Foundation/PDB_ArrayView.h - Foundation/PDB_Assert.h - Foundation/PDB_BitOperators.h - Foundation/PDB_BitUtil.h - Foundation/PDB_CRT.h - Foundation/PDB_Forward.h - Foundation/PDB_Log.h - Foundation/PDB_Macros.h - Foundation/PDB_Memory.h - Foundation/PDB_Move.h - Foundation/PDB_Platform.h - Foundation/PDB_PointerUtil.h - Foundation/PDB_TypeTraits.h - Foundation/PDB_Warnings.h - - PDB.cpp - PDB.h - PDB_CoalescedMSFStream.cpp - PDB_CoalescedMSFStream.h - PDB_DBIStream.cpp - PDB_DBIStream.h - PDB_DBITypes.cpp - PDB_DBITypes.h - PDB_DirectMSFStream.cpp - PDB_DirectMSFStream.h - PDB_ErrorCodes.h - PDB_GlobalSymbolStream.cpp - PDB_GlobalSymbolStream.h - PDB_ImageSectionStream.cpp - PDB_ImageSectionStream.h - PDB_InfoStream.cpp - PDB_InfoStream.h - PDB_IPIStream.cpp - PDB_IPIStream.h - PDB_IPITypes.h - PDB_ModuleInfoStream.cpp - PDB_ModuleInfoStream.h - PDB_ModuleLineStream.cpp - PDB_ModuleLineStream.h - PDB_ModuleSymbolStream.cpp - PDB_ModuleSymbolStream.h - PDB_NamesStream.cpp - PDB_NamesStream.h - PDB_PCH.cpp - PDB_PCH.h - PDB_PublicSymbolStream.cpp - PDB_PublicSymbolStream.h - PDB_RawFile.cpp - PDB_RawFile.h - PDB_SectionContributionStream.cpp - PDB_SectionContributionStream.h - PDB_SourceFileStream.cpp - PDB_SourceFileStream.h - PDB_TPIStream.cpp - PDB_TPIStream.h - PDB_TPITypes.h - PDB_Types.cpp - PDB_Types.h - PDB_Util.h -) - -source_group(src FILES - ${SOURCES} -) - -add_library(raw_pdb - ${SOURCES} -) - -target_include_directories(raw_pdb - PUBLIC - . -) - -target_precompile_headers(raw_pdb - PRIVATE - PDB_PCH.h -) - -option(RAWPDB_BUILD_EXAMPLES "Build Examples" ON) - -if (RAWPDB_BUILD_EXAMPLES) - add_subdirectory(Examples) -endif() - -if (UNIX) - include(GNUInstallDirs) - - install( - TARGETS raw_pdb - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) - - file(GLOB_RECURSE HEADER_FILES - "${CMAKE_CURRENT_SOURCE_DIR}/*.h" - ) - - file(GLOB_RECURSE HEADER_FILES_FOUNDATION - "${CMAKE_CURRENT_SOURCE_DIR}/Foundation/*.h" - ) - - install( - FILES ${HEADER_FILES} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/raw_pdb/" - ) - - install( - FILES ${HEADER_FILES_FOUNDATION} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/raw_pdb/Foundation" - ) -endif (UNIX) diff --git a/third_party/raw_pdb/src/Examples/CMakeLists.txt b/third_party/raw_pdb/src/Examples/CMakeLists.txt deleted file mode 100644 index 6e59c1a..0000000 --- a/third_party/raw_pdb/src/Examples/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -project(Examples) - -set(SOURCES - ExampleContributions.cpp - ExampleFunctionSymbols.cpp - ExampleFunctionVariables.cpp - ExampleIPI.cpp - ExampleLines.cpp - ExampleMain.cpp - ExampleMemoryMappedFile.cpp - ExampleMemoryMappedFile.h - ExamplePDBSize.cpp - Examples_PCH.cpp - Examples_PCH.h - ExampleSymbols.cpp - ExampleTimedScope.cpp - ExampleTimedScope.h - ExampleTypes.cpp - ExampleTypeTable.cpp - ExampleTypeTable.h -) - -source_group(src FILES - ${SOURCES} -) - -add_executable(Examples - ${SOURCES} -) - -target_link_libraries(Examples - PUBLIC - raw_pdb -) - -target_precompile_headers(Examples - PUBLIC - Examples_PCH.h -) \ No newline at end of file diff --git a/third_party/raw_pdb/src/Examples/ExampleContributions.cpp b/third_party/raw_pdb/src/Examples/ExampleContributions.cpp deleted file mode 100644 index 93c5091..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleContributions.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" - - -namespace -{ - // we don't have to store std::string in the contributions, since all the data is memory-mapped anyway. - // we do it in this example to ensure that we don't "cheat" when reading the PDB file. memory-mapped data will only - // be faulted into the process once it's touched, so actually copying the string data makes us touch the needed data, - // giving us a real performance measurement. - struct Contribution - { - std::string objectFile; - uint32_t rva; - uint32_t size; - }; -} - - -void ExampleContributions(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream); -void ExampleContributions(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) -{ - TimedScope total("\nRunning example \"Contributions\""); - - // in order to keep the example easy to understand, we load the PDB data serially. - // note that this can be improved a lot by reading streams concurrently. - - // prepare the image section stream first. it is needed for converting section + offset into an RVA - TimedScope sectionScope("Reading image section stream"); - const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile); - sectionScope.Done(); - - - // prepare the module info stream for matching contributions against files - TimedScope moduleScope("Reading module info stream"); - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - moduleScope.Done(); - - - // read contribution stream - TimedScope contributionScope("Reading section contribution stream"); - const PDB::SectionContributionStream sectionContributionStream = dbiStream.CreateSectionContributionStream(rawPdbFile); - contributionScope.Done(); - - std::vector contributions; - { - TimedScope scope("Storing contributions"); - - const PDB::ArrayView sectionContributions = sectionContributionStream.GetContributions(); - const size_t count = sectionContributions.GetLength(); - - contributions.reserve(count); - - for (const PDB::DBI::SectionContribution& contribution : sectionContributions) - { - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(contribution.section, contribution.offset); - if (rva == 0u) - { - printf("Contribution has invalid RVA\n"); - continue; - } - - const PDB::ModuleInfoStream::Module& module = moduleInfoStream.GetModule(contribution.moduleIndex); - - contributions.push_back(Contribution { module.GetName().Decay(), rva, contribution.size }); - } - - scope.Done(count); - } - - TimedScope sortScope("std::sort contributions"); - std::sort(contributions.begin(), contributions.end(), [](const Contribution& lhs, const Contribution& rhs) - { - return lhs.size > rhs.size; - }); - sortScope.Done(); - - total.Done(); - - // log the 20 largest contributions - { - printf("20 largest contributions:\n"); - - const size_t countToShow = std::min(20ul, contributions.size()); - for (size_t i = 0u; i < countToShow; ++i) - { - const Contribution& contribution = contributions[i]; - printf("%zu: %u bytes from %s\n", i + 1u, contribution.size, contribution.objectFile.c_str()); - } - } -} diff --git a/third_party/raw_pdb/src/Examples/ExampleFunctionSymbols.cpp b/third_party/raw_pdb/src/Examples/ExampleFunctionSymbols.cpp deleted file mode 100644 index fee212e..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleFunctionSymbols.cpp +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" - -namespace -{ - // in this example, we are only interested in function symbols: function name, RVA, and size. - // this is what most profilers need, they aren't interested in any other data. - struct FunctionSymbol - { - std::string name; - uint32_t rva; - uint32_t size; - const PDB::CodeView::DBI::Record* frameProc; - }; -} - - -void ExampleFunctionSymbols(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream); -void ExampleFunctionSymbols(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) -{ - TimedScope total("\nRunning example \"Function symbols\""); - - // in order to keep the example easy to understand, we load the PDB data serially. - // note that this can be improved a lot by reading streams concurrently. - - // prepare the image section stream first. it is needed for converting section + offset into an RVA - TimedScope sectionScope("Reading image section stream"); - const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile); - sectionScope.Done(); - - - // prepare the module info stream for grabbing function symbols from modules - TimedScope moduleScope("Reading module info stream"); - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - moduleScope.Done(); - - - // prepare symbol record stream needed by the public stream - TimedScope symbolStreamScope("Reading symbol record stream"); - const PDB::CoalescedMSFStream symbolRecordStream = dbiStream.CreateSymbolRecordStream(rawPdbFile); - symbolStreamScope.Done(); - - - // note that we only use unordered_set in order to keep the example code easy to understand. - // using other hash set implementations like e.g. abseil's Swiss Tables (https://abseil.io/about/design/swisstables) is *much* faster. - std::vector functionSymbols; - std::unordered_set seenFunctionRVAs; - - // start by reading the module stream, grabbing every function symbol we can find. - // in most cases, this gives us ~90% of all function symbols already, along with their size. - { - TimedScope scope("Storing function symbols from modules"); - - const PDB::ArrayView modules = moduleInfoStream.GetModules(); - - for (const PDB::ModuleInfoStream::Module& module : modules) - { - if (!module.HasSymbolStream()) - { - continue; - } - - const PDB::ModuleSymbolStream moduleSymbolStream = module.CreateSymbolStream(rawPdbFile); - moduleSymbolStream.ForEachSymbol([&functionSymbols, &seenFunctionRVAs, &imageSectionStream](const PDB::CodeView::DBI::Record* record) - { - // only grab function symbols from the module streams - const char* name = nullptr; - uint32_t rva = 0u; - uint32_t size = 0u; - if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_FRAMEPROC) - { - functionSymbols[functionSymbols.size() - 1].frameProc = record; - return; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_THUNK32) - { - if (record->data.S_THUNK32.thunk == PDB::CodeView::DBI::ThunkOrdinal::TrampolineIncremental) - { - // we have never seen incremental linking thunks stored inside a S_THUNK32 symbol, but better safe than sorry - name = "ILT"; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_THUNK32.section, record->data.S_THUNK32.offset); - size = 5u; - } - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_TRAMPOLINE) - { - // incremental linking thunks are stored in the linker module - name = "ILT"; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_TRAMPOLINE.thunkSection, record->data.S_TRAMPOLINE.thunkOffset); - size = 5u; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32) - { - name = record->data.S_LPROC32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LPROC32.section, record->data.S_LPROC32.offset); - size = record->data.S_LPROC32.codeSize; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GPROC32) - { - name = record->data.S_GPROC32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GPROC32.section, record->data.S_GPROC32.offset); - size = record->data.S_GPROC32.codeSize; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32_ID) - { - name = record->data.S_LPROC32_ID.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LPROC32_ID.section, record->data.S_LPROC32_ID.offset); - size = record->data.S_LPROC32_ID.codeSize; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GPROC32_ID) - { - name = record->data.S_GPROC32_ID.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GPROC32_ID.section, record->data.S_GPROC32_ID.offset); - size = record->data.S_GPROC32_ID.codeSize; - } - - if (rva == 0u) - { - return; - } - - functionSymbols.push_back(FunctionSymbol { name, rva, size, nullptr }); - seenFunctionRVAs.emplace(rva); - }); - } - - scope.Done(modules.GetLength()); - } - - // we don't need to touch global symbols in this case. - // most of the data we need can be obtained from the module symbol streams, and the global symbol stream only offers data symbols on top of that, which we are not interested in. - // however, there can still be public function symbols we haven't seen yet in any of the modules, especially for PDBs that don't provide module-specific information. - - // read public symbols - TimedScope publicScope("Reading public symbol stream"); - const PDB::PublicSymbolStream publicSymbolStream = dbiStream.CreatePublicSymbolStream(rawPdbFile); - publicScope.Done(); - { - TimedScope scope("Storing public function symbols"); - - const PDB::ArrayView hashRecords = publicSymbolStream.GetRecords(); - const size_t count = hashRecords.GetLength(); - - for (const PDB::HashRecord& hashRecord : hashRecords) - { - const PDB::CodeView::DBI::Record* record = publicSymbolStream.GetRecord(symbolRecordStream, hashRecord); - if (record->header.kind != PDB::CodeView::DBI::SymbolRecordKind::S_PUB32) - { - // normally, a PDB only contains S_PUB32 symbols in the public symbol stream, but we have seen PDBs that also store S_CONSTANT as public symbols. - // ignore these. - continue; - } - - if ((PDB_AS_UNDERLYING(record->data.S_PUB32.flags) & PDB_AS_UNDERLYING(PDB::CodeView::DBI::PublicSymbolFlags::Function)) == 0u) - { - // ignore everything that is not a function - continue; - } - - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_PUB32.section, record->data.S_PUB32.offset); - if (rva == 0u) - { - // certain symbols (e.g. control-flow guard symbols) don't have a valid RVA, ignore those - continue; - } - - // check whether we already know this symbol from one of the module streams - const auto it = seenFunctionRVAs.find(rva); - if (it != seenFunctionRVAs.end()) - { - // we know this symbol already, ignore it - continue; - } - - // this is a new function symbol, so store it. - // note that we don't know its size yet. - functionSymbols.push_back(FunctionSymbol { record->data.S_PUB32.name, rva, 0u, nullptr }); - } - - scope.Done(count); - } - - - // we still need to find the size of the public function symbols. - // this can be deduced by sorting the symbols by their RVA, and then computing the distance between the current and the next symbol. - // this works since functions are always mapped to executable pages, so they aren't interleaved by any data symbols. - TimedScope sortScope("std::sort function symbols"); - std::sort(functionSymbols.begin(), functionSymbols.end(), [](const FunctionSymbol& lhs, const FunctionSymbol& rhs) - { - return lhs.rva < rhs.rva; - }); - sortScope.Done(); - - const size_t symbolCount = functionSymbols.size(); - if (symbolCount != 0u) - { - TimedScope computeScope("Computing function symbol sizes"); - - size_t foundCount = 0u; - - // we have at least 1 symbol. - // compute missing symbol sizes by computing the distance from this symbol to the next. - // note that this includes "int 3" padding after the end of a function. if you don't want that, but the actual number of bytes of - // the function's code, your best bet is to use a disassembler instead. - for (size_t i = 0u; i < symbolCount - 1u; ++i) - { - FunctionSymbol& currentSymbol = functionSymbols[i]; - if (currentSymbol.size != 0u) - { - // the symbol's size is already known - continue; - } - - const FunctionSymbol& nextSymbol = functionSymbols[i + 1u]; - const size_t size = nextSymbol.rva - currentSymbol.rva; - (void)size; // unused - ++foundCount; - } - - // we know have the sizes of all symbols, except the last. - // this can be found by going through the contributions, if needed. - FunctionSymbol& lastSymbol = functionSymbols[symbolCount - 1u]; - if (lastSymbol.size == 0u) - { - // bad luck, we can't deduce the last symbol's size, so have to consult the contributions instead. - // we do a linear search in this case to keep the code simple. - const PDB::SectionContributionStream sectionContributionStream = dbiStream.CreateSectionContributionStream(rawPdbFile); - const PDB::ArrayView sectionContributions = sectionContributionStream.GetContributions(); - for (const PDB::DBI::SectionContribution& contribution : sectionContributions) - { - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(contribution.section, contribution.offset); - if (rva == 0u) - { - printf("Contribution has invalid RVA\n"); - continue; - } - - if (rva == lastSymbol.rva) - { - lastSymbol.size = contribution.size; - break; - } - - if (rva > lastSymbol.rva) - { - // should have found the contribution by now - printf("Unknown contribution for symbol %s at RVA 0x%X", lastSymbol.name.c_str(), lastSymbol.rva); - break; - } - } - } - - computeScope.Done(foundCount); - } - - total.Done(functionSymbols.size()); -} diff --git a/third_party/raw_pdb/src/Examples/ExampleFunctionVariables.cpp b/third_party/raw_pdb/src/Examples/ExampleFunctionVariables.cpp deleted file mode 100644 index 85b5610..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleFunctionVariables.cpp +++ /dev/null @@ -1,382 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "ExampleTypeTable.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" -#include "PDB_TPIStream.h" - -using SymbolRecordKind = PDB::CodeView::DBI::SymbolRecordKind; - -static std::string GetVariableTypeName(const TypeTable& typeTable, uint32_t typeIndex) -{ - // Defined in ExampleTypes.cpp - extern std::string GetTypeName(const TypeTable & typeTable, uint32_t typeIndex); - - std::string typeName = GetTypeName(typeTable, typeIndex); - - // Remove any '%s' substring used to insert a variable/field name. - const uint64_t markerPos = typeName.find("%s"); - if (markerPos != typeName.npos) - { - typeName.erase(markerPos, 2); - } - - return typeName; -} - -static void Printf(uint32_t indent, const char* format, ...) -{ - va_list args; - va_start(args, format); - - printf("%*s", indent * 4, ""); - vprintf(format, args); - - va_end(args); -} - -void ExampleFunctionVariables(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::TPIStream& tpiStream); -void ExampleFunctionVariables(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::TPIStream& tpiStream) -{ - TimedScope total("\nRunning example \"Function variables\""); - - TimedScope typeTableScope("Create TypeTable"); - TypeTable typeTable(tpiStream); - typeTableScope.Done(); - - // in order to keep the example easy to understand, we load the PDB data serially. - // note that this can be improved a lot by reading streams concurrently. - - // prepare the image section stream first. it is needed for converting section + offset into an RVA - TimedScope sectionScope("Reading image section stream"); - const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile); - sectionScope.Done(); - - // prepare the module info stream for grabbing function symbols from modules - TimedScope moduleScope("Reading module info stream"); - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - moduleScope.Done(); - - // prepare symbol record stream needed by the public stream - TimedScope symbolStreamScope("Reading symbol record stream"); - const PDB::CoalescedMSFStream symbolRecordStream = dbiStream.CreateSymbolRecordStream(rawPdbFile); - symbolStreamScope.Done(); - - { - TimedScope scope("Printing function variable records from modules\n"); - - const PDB::ArrayView modules = moduleInfoStream.GetModules(); - - uint32_t blockLevel = 0; - uint32_t recordCount = 0; - - for (const PDB::ModuleInfoStream::Module& module : modules) - { - if (!module.HasSymbolStream()) - { - continue; - } - - const PDB::ModuleSymbolStream moduleSymbolStream = module.CreateSymbolStream(rawPdbFile); - moduleSymbolStream.ForEachSymbol([&typeTable, &imageSectionStream, &blockLevel, &recordCount](const PDB::CodeView::DBI::Record* record) - { - const SymbolRecordKind kind = record->header.kind; - const PDB::CodeView::DBI::Record::Data& data = record->data; - - if (kind == SymbolRecordKind::S_END) - { - PDB_ASSERT(blockLevel > 0, "Block level for S_END is 0"); - blockLevel--; - Printf(blockLevel, "S_END\n"); - - if (blockLevel == 0) - { - Printf(0, "\n"); - } - } - else if(kind == SymbolRecordKind::S_SKIP) - { - Printf(blockLevel, "S_SKIP\n"); - } - else if (kind == SymbolRecordKind::S_BLOCK32) - { - const uint32_t offset = imageSectionStream.ConvertSectionOffsetToRVA(data.S_BLOCK32.section, data.S_BLOCK32.offset); - - Printf(blockLevel, "S_BLOCK32: '%s' | Code Offset 0x%X\n", data.S_BLOCK32.name, offset); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_LABEL32) - { - Printf(blockLevel, "S_LABEL32: '%s' | Offset 0x%X\n", data.S_LABEL32.name, data.S_LABEL32.offset); - } - else if(kind == SymbolRecordKind::S_CONSTANT) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_CONSTANT.typeIndex); - - Printf(blockLevel, "S_CONSTANT: '%s' -> '%s' | Value 0x%X\n", typeName.c_str(), data.S_CONSTANT.name, data.S_CONSTANT.value); - } - else if(kind == SymbolRecordKind::S_LOCAL) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_LOCAL.typeIndex); - Printf(blockLevel, "S_LOCAL: '%s' -> '%s' | Param: %s | Optimized Out: %s\n", typeName.c_str(), data.S_LOCAL.name, data.S_LOCAL.flags.fIsParam ? "True" : "False", data.S_LOCAL.flags.fIsOptimizedOut ? "True" : "False"); - } - else if (kind == SymbolRecordKind::S_DEFRANGE_REGISTER) - { - Printf(blockLevel, "S_DEFRANGE_REGISTER: Register 0x%X\n", data.S_DEFRANGE_REGISTER.reg); - } - else if(kind == SymbolRecordKind::S_DEFRANGE_FRAMEPOINTER_REL) - { - Printf(blockLevel, "S_DEFRANGE_FRAMEPOINTER_REL: Frame Pointer Offset 0x%X | Range Start 0x%X | Range Section Start 0x%X | Range Length %u\n", - data.S_DEFRANGE_FRAMEPOINTER_REL.offsetFramePointer, - data.S_DEFRANGE_FRAMEPOINTER_REL.range.offsetStart, - data.S_DEFRANGE_FRAMEPOINTER_REL.range.isectionStart, - data.S_DEFRANGE_FRAMEPOINTER_REL.range.length); - } - else if(kind == SymbolRecordKind::S_DEFRANGE_SUBFIELD_REGISTER) - { - Printf(blockLevel, "S_DEFRANGE_SUBFIELD_REGISTER: Register %u | Parent offset 0x%X | Range Start 0x%X | Range Section Start 0x%X | Range Length %u\n", - data.S_DEFRANGE_SUBFIELD_REGISTER.reg, - data.S_DEFRANGE_SUBFIELD_REGISTER.offsetParent, - data.S_DEFRANGE_SUBFIELD_REGISTER.range.offsetStart, - data.S_DEFRANGE_SUBFIELD_REGISTER.range.isectionStart, - data.S_DEFRANGE_SUBFIELD_REGISTER.range.length); - } - else if (kind == SymbolRecordKind::S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE) - { - Printf(blockLevel, "S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: Offset 0x%X\n", data.S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE.offsetFramePointer); - } - else if (kind == SymbolRecordKind::S_DEFRANGE_REGISTER_REL) - { - Printf(blockLevel, "S_DEFRANGE_REGISTER_REL: Base Register %u | Parent offset 0x%X | Base Register Offset 0x%X | Range Start 0x%X | Range Section Start 0x%X | Range Length %u\n", - data.S_DEFRANGE_REGISTER_REL.baseRegister, - data.S_DEFRANGE_REGISTER_REL.offsetParent, - data.S_DEFRANGE_REGISTER_REL.offsetBasePointer, - data.S_DEFRANGE_REGISTER_REL.offsetParent, - data.S_DEFRANGE_REGISTER_REL.range.offsetStart, - data.S_DEFRANGE_REGISTER_REL.range.isectionStart, - data.S_DEFRANGE_REGISTER_REL.range.length); - } - else if(kind == SymbolRecordKind::S_FILESTATIC) - { - Printf(blockLevel, "S_FILESTATIC: '%s'\n", data.S_FILESTATIC.name); - } - else if (kind == SymbolRecordKind::S_INLINESITE) - { - Printf(blockLevel, "S_INLINESITE: Parent 0x%X\n", data.S_INLINESITE.parent); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_INLINESITE_END) - { - PDB_ASSERT(blockLevel > 0, "Block level for S_INLINESITE_END is 0"); - blockLevel--; - Printf(blockLevel, "S_INLINESITE_END:\n"); - } - else if (kind == SymbolRecordKind::S_CALLEES) - { - Printf(blockLevel, "S_CALLEES: Count %u\n", data.S_CALLEES.count); - } - else if (kind == SymbolRecordKind::S_CALLERS) - { - Printf(blockLevel, "S_CALLERS: Count %u\n", data.S_CALLERS.count); - } - else if (kind == SymbolRecordKind::S_INLINEES) - { - Printf(blockLevel, "S_INLINEES: Count %u\n", data.S_INLINEES.count); - } - else if (kind == SymbolRecordKind::S_LDATA32) - { - if (blockLevel > 0) - { - // Not sure why some type index 0 (T_NO_TYPE) are included in some PDBs. - if (data.S_LDATA32.typeIndex != 0) // PDB::CodeView::TPI::TypeIndexKind::T_NOTYPE) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_LDATA32.typeIndex); - Printf(blockLevel, "S_LDATA32: '%s' -> '%s'\n", data.S_LDATA32.name, typeName.c_str()); - } - } - } - else if (kind == SymbolRecordKind::S_LTHREAD32) - { - if (blockLevel > 0) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_LTHREAD32.typeIndex); - Printf(blockLevel, "S_LTHREAD32: '%s' -> '%s'\n", data.S_LTHREAD32.name, typeName.c_str()); - } - } - else if (kind == SymbolRecordKind::S_UDT) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_UDT.typeIndex); - - Printf(blockLevel, "S_UDT: '%s' -> '%s'\n", data.S_UDT.name, typeName.c_str()); - } - else if (kind == PDB::CodeView::DBI::SymbolRecordKind::S_REGISTER) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_REGSYM.typeIndex); - - Printf(blockLevel, "S_REGSYM: '%s' -> '%s' | Register %i\n", - data.S_REGSYM.name, typeName.c_str(), - data.S_REGSYM.reg); - } - else if (kind == PDB::CodeView::DBI::SymbolRecordKind::S_BPREL32) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_BPRELSYM32.typeIndex); - - Printf(blockLevel, "S_BPRELSYM32: '%s' -> '%s' | BP register Offset 0x%X\n", - data.S_BPRELSYM32.name, typeName.c_str(), - data.S_BPRELSYM32.offset); - } - else if (kind == PDB::CodeView::DBI::SymbolRecordKind::S_REGREL32) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_REGREL32.typeIndex); - - Printf(blockLevel, "S_REGREL32: '%s' -> '%s' | Register %i | Register Offset 0x%X\n", - data.S_REGREL32.name, typeName.c_str(), - data.S_REGREL32.reg, - data.S_REGREL32.offset); - } - else if(kind == SymbolRecordKind::S_FRAMECOOKIE) - { - Printf(blockLevel, "S_FRAMECOOKIE: Offset 0x%X | Register %u | Type %u\n", - data.S_FRAMECOOKIE.offset, - data.S_FRAMECOOKIE.reg, - data.S_FRAMECOOKIE.cookietype); - } - else if(kind == SymbolRecordKind::S_CALLSITEINFO) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_CALLSITEINFO.typeIndex); - Printf(blockLevel, "S_CALLSITEINFO: '%s' | Offset 0x%X | Section %u\n", typeName.c_str(), data.S_CALLSITEINFO.offset, data.S_CALLSITEINFO.section); - } - else if(kind == SymbolRecordKind::S_HEAPALLOCSITE) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_HEAPALLOCSITE.typeIndex); - Printf(blockLevel, "S_HEAPALLOCSITE: '%s' | Offset 0x%X | Section %u | Instruction Length %u\n", typeName.c_str(), - data.S_HEAPALLOCSITE.offset, - data.S_HEAPALLOCSITE.section, - data.S_HEAPALLOCSITE.instructionLength); - } - else if (kind == SymbolRecordKind::S_FRAMEPROC) - { - Printf(blockLevel, "S_FRAMEPROC: Size %u | Padding %u | Padding Offset 0x%X | Callee Registers Size %u\n", - data.S_FRAMEPROC.cbFrame, - data.S_FRAMEPROC.cbPad, - data.S_FRAMEPROC.offPad, - data.S_FRAMEPROC.cbSaveRegs); - } - else if (kind == SymbolRecordKind::S_ANNOTATION) - { - Printf(blockLevel, "S_ANNOTATION: Offset 0x%X | Count %u\n", data.S_ANNOTATIONSYM.offset, data.S_ANNOTATIONSYM.annotationsCount); - // print N null-terminated annotation strings, skipping their null-terminators to get to the next string - const char* annotation = data.S_ANNOTATIONSYM.annotations; - for (int i = 0; i < data.S_ANNOTATIONSYM.annotationsCount; ++i, annotation += strlen(annotation) + 1) - Printf(blockLevel + 1, "S_ANNOTATION.%u: %s\n", i, annotation); - PDB_ASSERT(annotation <= (const char*)record + record->header.size + sizeof(record->header.size), - "Annotation strings end beyond the record size %X; annotaions count: %u", record->header.size, data.S_ANNOTATIONSYM.annotationsCount); - } - else if (kind == SymbolRecordKind::S_THUNK32) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - - if (data.S_THUNK32.thunk == PDB::CodeView::DBI::ThunkOrdinal::TrampolineIncremental) - { - // we have never seen incremental linking thunks stored inside a S_THUNK32 symbol, but better safe than sorry - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_THUNK32.section, data.S_THUNK32.offset); - Printf(blockLevel, "Function: 'ILT/Thunk' | RVA 0x%X\n", rva); - } - else - { - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_THUNK32.section, data.S_THUNK32.offset); - Printf(blockLevel, "S_THUNK32 Function '%s' | RVA 0x%X\n", data.S_THUNK32.name, rva); - blockLevel++; - } - } - else if (kind == SymbolRecordKind::S_TRAMPOLINE) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - // incremental linking thunks are stored in the linker module - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_TRAMPOLINE.thunkSection, data.S_TRAMPOLINE.thunkOffset); - Printf(blockLevel, "Function 'ILT/Trampoline' | RVA 0x%X\n", rva); - } - else if (kind == SymbolRecordKind::S_LPROC32) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_LPROC32.section, data.S_LPROC32.offset); - Printf(blockLevel, "S_LPROC32 Function '%s' | RVA 0x%X\n", data.S_LPROC32.name, rva); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_GPROC32) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_GPROC32.section, data.S_GPROC32.offset); - Printf(blockLevel, "S_GPROC32 Function '%s' | RVA 0x%X\n", data.S_GPROC32.name, rva); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_LPROC32_ID) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_LPROC32_ID.section, data.S_LPROC32_ID.offset); - Printf(blockLevel, "S_LPROC32_ID Function '%s' | RVA 0x%X\n", data.S_LPROC32_ID.name, rva); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_GPROC32_ID) - { - PDB_ASSERT(blockLevel == 0, "BlockLevel %u != 0", blockLevel); - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(data.S_GPROC32_ID.section, data.S_GPROC32_ID.offset); - Printf(blockLevel, "S_GPROC32_ID Function '%s' | RVA 0x%X\n", data.S_GPROC32_ID.name, rva); - blockLevel++; - } - else if (kind == SymbolRecordKind::S_REGREL32_INDIR) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_REGREL32_INDIR.typeIndex); - - Printf(blockLevel, "S_REGREL32_INDIR: '%s' -> '%s' | Register %i | Unknown1 0x%X | Unknown2 0x%X\n", - data.S_REGREL32_INDIR.name, typeName.c_str(), - data.S_REGREL32_INDIR.unknown1, - data.S_REGREL32_INDIR.unknown1); - } - else if (kind == SymbolRecordKind::S_REGREL32_ENCTMP) - { - const std::string typeName = GetVariableTypeName(typeTable, data.S_REGREL32.typeIndex); - - Printf(blockLevel, "S_REGREL32_ENCTMP: '%s' -> '%s' | Register %i | Register Offset 0x%X\n", - data.S_REGREL32.name, typeName.c_str(), - data.S_REGREL32.reg, - data.S_REGREL32.offset); - } - else if (kind == SymbolRecordKind::S_UNAMESPACE) - { - Printf(blockLevel, "S_UNAMESPACE: '%s'\n", data.S_UNAMESPACE.name); - } - else if (kind == SymbolRecordKind::S_ARMSWITCHTABLE) - { - Printf(blockLevel, "S_ARMSWITCHTABLE: " - "Switch Type: %u | Num Entries: %u | Base Section: %u | Base Offset: 0x%X | " - "Branch Section: %u | Branch Offset: 0x%X | Table Section: %u | Table Offset: 0x%X\n", - data.S_ARMSWITCHTABLE.switchType, - data.S_ARMSWITCHTABLE.numEntries, - data.S_ARMSWITCHTABLE.sectionBase, - data.S_ARMSWITCHTABLE.offsetBase, - data.S_ARMSWITCHTABLE.sectionBranch, - data.S_ARMSWITCHTABLE.offsetBranch, - data.S_ARMSWITCHTABLE.sectionTable, - data.S_ARMSWITCHTABLE.offsetTable); - } - else - { - // We only care about records inside functions. - if (blockLevel > 0) - { - PDB_ASSERT(false, "Unhandled record kind 0x%X with block level %u\n", static_cast(kind), blockLevel); - } - } - - recordCount++; - - }); - } - - scope.Done(recordCount); - } -} diff --git a/third_party/raw_pdb/src/Examples/ExampleIPI.cpp b/third_party/raw_pdb/src/Examples/ExampleIPI.cpp deleted file mode 100644 index 5286689..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleIPI.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "ExampleTypeTable.h" -#include "PDB_RawFile.h" -#include "PDB_InfoStream.h" -#include "PDB_IPIStream.h" -#include "PDB_TPIStream.h" - -static std::string GetTypeNameIPI(const TypeTable& typeTable, uint32_t typeIndex) -{ - // Defined in ExampleTypes.cpp - extern std::string GetTypeName(const TypeTable & typeTable, uint32_t typeIndex); - - std::string typeName = GetTypeName(typeTable, typeIndex); - - // Remove any '%s' substring used to insert a variable/field name. - const uint64_t markerPos = typeName.find("%s"); - if (markerPos != typeName.npos) - { - typeName.erase(markerPos, 2); - } - - return typeName; -} - -void ExampleIPI(const PDB::RawFile& rawPdbFile, const PDB::InfoStream& infoStream, const PDB::TPIStream& tpiStream, const PDB::IPIStream& ipiStream); - -void ExampleIPI(const PDB::RawFile& rawPdbFile, const PDB::InfoStream& infoStream, const PDB::TPIStream& tpiStream, const PDB::IPIStream& ipiStream) -{ - if (!infoStream.HasIPIStream()) - { - return; - } - - TimedScope total("\nRunning example \"IPI\""); - - TimedScope typeTableScope("Create TypeTable"); - TypeTable typeTable(tpiStream); - typeTableScope.Done(); - - // prepare names stream for grabbing file paths from lines - TimedScope namesScope("Reading names stream"); - const PDB::NamesStream namesStream = infoStream.CreateNamesStream(rawPdbFile); - namesScope.Done(); - - const uint32_t firstTypeIndex = ipiStream.GetFirstTypeIndex(); - - PDB::ArrayView records = ipiStream.GetTypeRecords(); - - std::vector strings; - - strings.resize(records.GetLength(), nullptr); - - size_t index = 0; - - for (const PDB::CodeView::IPI::Record* record : records) - { - const PDB::CodeView::IPI::RecordHeader& header = record->header; - - if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_STRING_ID) - { - strings[index] = record->data.LF_STRING_ID.name; - } - - index++; - } - - uint32_t identifier = firstTypeIndex; - - std::string typeName, parentTypeName; - - printf("\n --- IPI Records ---\n\n"); - - for(const PDB::CodeView::IPI::Record* record : records) - { - const PDB::CodeView::IPI::RecordHeader& header = record->header; - - if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_FUNC_ID) - { - typeName = GetTypeNameIPI(typeTable, record->data.LF_FUNC_ID.typeIndex); - - printf("Kind: 'LF_FUNC_ID' Size: %i ID: %u\n", header.size, identifier); - printf(" Scope ID: %u\n Type: '%s'\n Name: '%s'\n\n", - record->data.LF_FUNC_ID.scopeId, - typeName.c_str(), - record->data.LF_FUNC_ID.name); - - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_MFUNC_ID) - { - typeName = GetTypeNameIPI(typeTable, record->data.LF_MFUNC_ID.typeIndex); - parentTypeName = GetTypeNameIPI(typeTable, record->data.LF_MFUNC_ID.parentTypeIndex); - - printf("Kind: 'LF_MFUNC_ID' Size: %i ID: %u\n", header.size, identifier); - printf(" Parent Type: '%s'\n Type: '%s'\n Name: '%s'\n\n", - parentTypeName.c_str(), - typeName.c_str(), - record->data.LF_MFUNC_ID.name); - - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_BUILDINFO) - { - printf("Kind: 'LF_BUILDINFO' Size: %u ID: %u\n", header.size, identifier); - - if (record->data.LF_BUILDINFO.count == 0) - { - continue; - } - - printf("Strings: '%s'", strings[record->data.LF_BUILDINFO.typeIndices[0] - firstTypeIndex]); - - for (uint32_t i = 1, size = record->data.LF_BUILDINFO.count; i < size; ++i) - { - const uint32_t stringIndex = record->data.LF_BUILDINFO.typeIndices[i]; - - if (stringIndex == 0) - { - printf(", ''"); - } - else - { - printf(", '%s'", strings[stringIndex - firstTypeIndex]); - } - } - - printf("\n\n"); - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_SUBSTR_LIST) - { - printf("Kind: 'LF_SUBSTR_LIST' Size: %u ID: %u\n", header.size, identifier); - - if (record->data.LF_SUBSTR_LIST.count == 0) - { - continue; - } - - printf(" Strings: '%s'", strings[record->data.LF_SUBSTR_LIST.typeIndices[0] - firstTypeIndex]); - - for (uint32_t i = 1, size = record->data.LF_SUBSTR_LIST.count; i < size; ++i) - { - const uint32_t stringIndex = record->data.LF_SUBSTR_LIST.typeIndices[i]; - - if (stringIndex == 0) - { - printf(", ''"); - } - else - { - printf(", '%s'", strings[stringIndex - firstTypeIndex]); - } - } - - printf("\n\n"); - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_STRING_ID) - { - printf("Kind: 'LF_STRING_ID' Size: %u ID: %u\n", header.size, identifier); - - printf(" Substring ID: %u\n Name: '%s'\n\n", record->data.LF_STRING_ID.id, record->data.LF_STRING_ID.name); - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_UDT_SRC_LINE) - { - typeName = GetTypeNameIPI(typeTable, record->data.LF_UDT_SRC_LINE.typeIndex); - - const uint32_t stringIndex = record->data.LF_UDT_SRC_LINE.stringIndex; - - printf("Kind: 'LF_UDT_SRC_LINE' Size: %u ID: %u\n", header.size, identifier); - - printf(" Type: '%s'\n Source Path: %s\n Line: %u\n\n", - typeName.c_str(), - strings[stringIndex - firstTypeIndex], - record->data.LF_UDT_SRC_LINE.line); - } - else if (header.kind == PDB::CodeView::IPI::TypeRecordKind::LF_UDT_MOD_SRC_LINE) - { - typeName = GetTypeNameIPI(typeTable, record->data.LF_UDT_MOD_SRC_LINE.typeIndex); - - const char* string = namesStream.GetFilename(record->data.LF_UDT_MOD_SRC_LINE.stringIndex); - - printf("Kind: 'LF_UDT_SRC_LINE' Size: %u ID: %u\n", header.size, identifier); - - printf(" Type: '%s'\n Source Path: %s\n Line: %u\n Module Index: %u\n\n", - typeName.c_str(), - string, - record->data.LF_UDT_MOD_SRC_LINE.line, - record->data.LF_UDT_MOD_SRC_LINE.moduleIndex); - } - else - { - printf("Kind: 0x%X Size: %u ID: %u\n\n", static_cast(header.kind), header.size, identifier); - } - - identifier++; - } -} diff --git a/third_party/raw_pdb/src/Examples/ExampleLines.cpp b/third_party/raw_pdb/src/Examples/ExampleLines.cpp deleted file mode 100644 index f055b98..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleLines.cpp +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "Foundation/PDB_PointerUtil.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" -#include "PDB_InfoStream.h" - -#include - -namespace -{ - struct Section - { - uint16_t index; - uint32_t offset; - size_t lineIndex; - }; - - struct Filename - { - uint32_t fileChecksumOffset; - uint32_t namesFilenameOffset; - PDB::CodeView::DBI::ChecksumKind checksumKind; - uint8_t checksumSize; - uint8_t checksum[32]; - }; - - struct Line - { - uint32_t lineNumber; - uint32_t codeSize; - size_t filenameIndex; - }; -} - -void ExampleLines(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::InfoStream& infoStream); -void ExampleLines(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::InfoStream& infoStream) -{ - if (!infoStream.HasNamesStream()) - { - printf("PDB has no '/names' stream for looking up filenames for lines, skipping \"Lines\" example."); - return; - } - - TimedScope total("\nRunning example \"Lines\""); - - // prepare the image section stream first. it is needed for converting section + offset into an RVA - TimedScope sectionScope("Reading image section stream"); - const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile); - sectionScope.Done(); - - // prepare the module info stream for grabbing function symbols from modules - TimedScope moduleScope("Reading module info stream"); - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - moduleScope.Done(); - - // prepare names stream for grabbing file paths from lines - TimedScope namesScope("Reading names stream"); - const PDB::NamesStream namesStream = infoStream.CreateNamesStream(rawPdbFile); - namesScope.Done(); - - // keeping sections and lines separate, as sorting the smaller Section struct is 2x faster in release builds - // than having all the fields in one big Line struct and sorting those. - std::vector
sections; - std::vector filenames; - std::vector lines; - - { - TimedScope scope("Storing lines from modules"); - - const PDB::ArrayView modules = moduleInfoStream.GetModules(); - - for (const PDB::ModuleInfoStream::Module& module : modules) - { - if (!module.HasLineStream()) - { - continue; - } - - const PDB::ModuleLineStream moduleLineStream = module.CreateLineStream(rawPdbFile); - - const size_t moduleFilenamesStartIndex = filenames.size(); - const PDB::CodeView::DBI::FileChecksumHeader* moduleFileChecksumHeader = nullptr; - - moduleLineStream.ForEachSection([&moduleLineStream, &namesStream, &moduleFileChecksumHeader, §ions, &filenames, &lines](const PDB::CodeView::DBI::LineSection* lineSection) - { - if (lineSection->header.kind == PDB::CodeView::DBI::DebugSubsectionKind::S_LINES) - { - moduleLineStream.ForEachLinesBlock(lineSection, - [&lineSection, §ions, &filenames, &lines](const PDB::CodeView::DBI::LinesFileBlockHeader* linesBlockHeader, const PDB::CodeView::DBI::Line* blocklines, const PDB::CodeView::DBI::Column* blockColumns) - { - if (linesBlockHeader->numLines == 0) - { - return; - } - - const PDB::CodeView::DBI::Line& firstLine = blocklines[0]; - - const uint16_t sectionIndex = lineSection->linesHeader.sectionIndex; - const uint32_t sectionOffset = lineSection->linesHeader.sectionOffset; - const uint32_t fileChecksumOffset = linesBlockHeader->fileChecksumOffset; - - const size_t filenameIndex = filenames.size(); - - // there will be duplicate filenames for any real world pdb. - // ideally the filenames would be stored in a map with the filename or checksum as the key. - // but that would complicate the logic in this example and therefore just use a vector to make it easier to understand. - filenames.push_back({ fileChecksumOffset, 0, PDB::CodeView::DBI::ChecksumKind::None, 0, {0} }); - - sections.push_back({ sectionIndex, sectionOffset, lines.size() }); - - // initially set code size of first line to 0, will be updated in loop below. - lines.push_back({ firstLine.linenumStart, 0, filenameIndex }); - - for(uint32_t i = 1, size = linesBlockHeader->numLines; i < size; ++i) - { - const PDB::CodeView::DBI::Line& line = blocklines[i]; - - // calculate code size of previous line by using the current line offset. - lines.back().codeSize = line.offset - blocklines[i-1].offset; - - sections.push_back({ sectionIndex, sectionOffset + line.offset, lines.size() }); - lines.push_back({ line.linenumStart, 0, filenameIndex }); - } - - // calc code size of last line - lines.back().codeSize = lineSection->linesHeader.codeSize - blocklines[linesBlockHeader->numLines-1].offset; - - // columns are optional - if (blockColumns == nullptr) - { - return; - } - - for (uint32_t i = 0, size = linesBlockHeader->numLines; i < size; ++i) - { - const PDB::CodeView::DBI::Column& column = blockColumns[i]; - (void)column; - } - }); - } - else if (lineSection->header.kind == PDB::CodeView::DBI::DebugSubsectionKind::S_FILECHECKSUMS) - { - // how to read checksums and their filenames from the Names Stream - moduleLineStream.ForEachFileChecksum(lineSection, [&namesStream](const PDB::CodeView::DBI::FileChecksumHeader* fileChecksumHeader) - { - const char* filename = namesStream.GetFilename(fileChecksumHeader->filenameOffset); - (void)filename; - }); - - // store the checksum header for the module, as there might be more lines after the checksums. - // so lines will get their checksum header values assigned after processing all line sections in the module. - PDB_ASSERT(moduleFileChecksumHeader == nullptr, "Module File Checksum Header already set"); - moduleFileChecksumHeader = &lineSection->checksumHeader; - } - else if (lineSection->header.kind == PDB::CodeView::DBI::DebugSubsectionKind::S_INLINEELINES) - { - if (lineSection->inlineeHeader.kind == PDB::CodeView::DBI::InlineeSourceLineKind::Signature) - { - moduleLineStream.ForEachInlineeSourceLine(lineSection, [](const PDB::CodeView::DBI::InlineeSourceLine* inlineeSourceLine) - { - (void)inlineeSourceLine; - - }); - } - else - { - moduleLineStream.ForEachInlineeSourceLineEx(lineSection, [](const PDB::CodeView::DBI::InlineeSourceLineEx* inlineeSourceLineEx) - { - for (uint32_t i = 0; i < inlineeSourceLineEx->extraLines; ++i) - { - const uint32_t checksumOffset = inlineeSourceLineEx->extrafileChecksumOffsets[i]; - (void)checksumOffset; - } - }); - } - } - else - { - PDB_ASSERT(false, "Line Section kind 0x%X not handled", static_cast(lineSection->header.kind)); - } - }); - - // assign checksum values for each filename added in this module - for (size_t i = moduleFilenamesStartIndex, size = filenames.size(); i < size; ++i) - { - Filename& filename = filenames[i]; - - // look up the filename's checksum header in the module's checksums section - const PDB::CodeView::DBI::FileChecksumHeader* checksumHeader = PDB::Pointer::Offset(moduleFileChecksumHeader, filename.fileChecksumOffset); - - PDB_ASSERT(checksumHeader->checksumKind >= PDB::CodeView::DBI::ChecksumKind::None && - checksumHeader->checksumKind <= PDB::CodeView::DBI::ChecksumKind::SHA256, - "Invalid checksum kind %u", static_cast(checksumHeader->checksumKind)); - - // store checksum values in filname struct - filename.namesFilenameOffset = checksumHeader->filenameOffset; - filename.checksumKind = checksumHeader->checksumKind; - filename.checksumSize = checksumHeader->checksumSize; - std::memcpy(filename.checksum, checksumHeader->checksum, checksumHeader->checksumSize); - } - } - - scope.Done(modules.GetLength()); - - TimedScope sortScope("std::sort sections"); - - // sort sections, so we can iterate over lines by address order. - std::sort(sections.begin(), sections.end(), [](const Section& lhs, const Section& rhs) - { - if (lhs.index == rhs.index) - { - return lhs.offset < rhs.offset; - } - - return lhs.index < rhs.index; - }); - - sortScope.Done(sections.size()); - -// Disabled by default, as it will print a lot of lines for large PDBs :-) -#if 0 - // DIA2Dump style lines output - static const char hexChars[17] = "0123456789ABCDEF"; - char checksumString[128]; - - printf("*** LINES RAW PDB\n"); - - const char* prevFilename = nullptr; - - for (const Section& section : sections) - { - const Line& line = lines[section.lineIndex]; - const Filename& lineFilename = filenames[line.filenameIndex]; - - const char* filename = namesStream.GetFilename(lineFilename.namesFilenameOffset); - - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(section.index, section.offset); - - // only print filename for a line if it is different from the previous one. - if (filename != prevFilename) - { - for (size_t i = 0, j = 0; i < lineFilename.checksumSize; i++, j+=2) - { - checksumString[j] = hexChars[lineFilename.checksum[i] >> 4]; - checksumString[j+1] = hexChars[lineFilename.checksum[i] & 0xF]; - } - - checksumString[lineFilename.checksumSize * 2] = '\0'; - - printf(" line %u at [0x%08X][0x%04X:0x%08X], len = 0x%X %s (0x%02X: %s)\n", - line.lineNumber, rva, section.index, section.offset, line.codeSize, - filename, static_cast(lineFilename.checksumKind), checksumString); - - prevFilename = filename; - } - else - { - printf(" line %u at [0x%08X][0x%04X:0x%08X], len = 0x%X\n", - line.lineNumber, rva, section.index, section.offset, line.codeSize); - } - } -#endif - } -} diff --git a/third_party/raw_pdb/src/Examples/ExampleMain.cpp b/third_party/raw_pdb/src/Examples/ExampleMain.cpp deleted file mode 100644 index b424942..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleMain.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleMemoryMappedFile.h" -#include "PDB.h" -#include "PDB_RawFile.h" -#include "PDB_InfoStream.h" -#include "PDB_DBIStream.h" -#include "PDB_TPIStream.h" -#include "PDB_IPIStream.h" -#include "PDB_NamesStream.h" - -namespace -{ - PDB_NO_DISCARD static bool IsError(PDB::ErrorCode errorCode) - { - switch (errorCode) - { - case PDB::ErrorCode::Success: - return false; - - case PDB::ErrorCode::InvalidSuperBlock: - printf("Invalid Superblock\n"); - return true; - - case PDB::ErrorCode::InvalidFreeBlockMap: - printf("Invalid free block map\n"); - return true; - - case PDB::ErrorCode::InvalidStream: - printf("Invalid stream\n"); - return true; - - case PDB::ErrorCode::InvalidSignature: - printf("Invalid stream signature\n"); - return true; - - case PDB::ErrorCode::InvalidStreamIndex: - printf("Invalid stream index\n"); - return true; - - case PDB::ErrorCode::InvalidDataSize: - printf("Invalid data size\n"); - return true; - - case PDB::ErrorCode::UnknownVersion: - printf("Unknown version\n"); - return true; - } - - // only ErrorCode::Success means there wasn't an error, so all other paths have to assume there was an error - return true; - } - - PDB_NO_DISCARD static bool HasValidDBIStreams(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) - { - // check whether the DBI stream offers all sub-streams we need - if (IsError(dbiStream.HasValidSymbolRecordStream(rawPdbFile))) - { - return false; - } - - if (IsError(dbiStream.HasValidPublicSymbolStream(rawPdbFile))) - { - return false; - } - - if (IsError(dbiStream.HasValidGlobalSymbolStream(rawPdbFile))) - { - return false; - } - - if (IsError(dbiStream.HasValidSectionContributionStream(rawPdbFile))) - { - return false; - } - - if (IsError(dbiStream.HasValidImageSectionStream(rawPdbFile))) - { - return false; - } - - return true; - } -} - - -// declare all examples -extern void ExamplePDBSize(const PDB::RawFile&, const PDB::DBIStream&); -extern void ExampleTPISize(const PDB::TPIStream& tpiStream, const char* outPath); -extern void ExampleContributions(const PDB::RawFile&, const PDB::DBIStream&); -extern void ExampleSymbols(const PDB::RawFile&, const PDB::DBIStream&); -extern void ExampleFunctionSymbols(const PDB::RawFile&, const PDB::DBIStream&); -extern void ExampleFunctionVariables(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::TPIStream&); -extern void ExampleLines(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream, const PDB::InfoStream& infoStream); -extern void ExampleTypes(const PDB::TPIStream&); -extern void ExampleIPI(const PDB::RawFile& rawPdbFile, const PDB::InfoStream& infoStream, const PDB::TPIStream& tpiStream, const PDB::IPIStream& ipiStream); - -int main(int argc, char** argv) -{ - if (argc != 2) - { - printf("Usage: Examples \nError: Incorrect usage\n"); - - return 1; - } - - printf("Opening PDB file %s\n", argv[1]); - - // try to open the PDB file and check whether all the data we need is available - MemoryMappedFile::Handle pdbFile = MemoryMappedFile::Open(argv[1]); - if (!pdbFile.baseAddress) - { - printf("Cannot memory-map file %s\n", argv[1]); - - return 1; - } - - if (IsError(PDB::ValidateFile(pdbFile.baseAddress, pdbFile.len))) - { - MemoryMappedFile::Close(pdbFile); - - return 2; - } - - const PDB::RawFile rawPdbFile = PDB::CreateRawFile(pdbFile.baseAddress); - if (IsError(PDB::HasValidDBIStream(rawPdbFile))) - { - MemoryMappedFile::Close(pdbFile); - - return 3; - } - - const PDB::InfoStream infoStream(rawPdbFile); - if (infoStream.UsesDebugFastLink()) - { - printf("PDB was linked using unsupported option /DEBUG:FASTLINK\n"); - - MemoryMappedFile::Close(pdbFile); - - return 4; - } - - const auto h = infoStream.GetHeader(); - printf("Version %u, signature %u, age %u, GUID %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n", - static_cast(h->version), h->signature, h->age, - h->guid.Data1, h->guid.Data2, h->guid.Data3, - h->guid.Data4[0], h->guid.Data4[1], h->guid.Data4[2], h->guid.Data4[3], h->guid.Data4[4], h->guid.Data4[5], h->guid.Data4[6], h->guid.Data4[7]); - - const PDB::DBIStream dbiStream = PDB::CreateDBIStream(rawPdbFile); - if (!HasValidDBIStreams(rawPdbFile, dbiStream)) - { - MemoryMappedFile::Close(pdbFile); - - return 5; - } - - if (IsError(PDB::HasValidTPIStream(rawPdbFile))) - { - MemoryMappedFile::Close(pdbFile); - - return 5; - } - const PDB::TPIStream tpiStream = PDB::CreateTPIStream(rawPdbFile); - - PDB::IPIStream ipiStream; - - // It's perfectly possible that an old PDB does not have an IPI stream. - if(infoStream.HasIPIStream()) - { - PDB::ErrorCode error = PDB::HasValidIPIStream(rawPdbFile); - - if (error != PDB::ErrorCode::InvalidStream && IsError(error)) - { - MemoryMappedFile::Close(pdbFile); - - return 5; - } - - ipiStream = PDB::CreateIPIStream(rawPdbFile); - } - - - // run all examples - ExamplePDBSize(rawPdbFile, dbiStream); - ExampleContributions(rawPdbFile, dbiStream); - ExampleSymbols(rawPdbFile, dbiStream); - ExampleFunctionSymbols(rawPdbFile, dbiStream); - ExampleFunctionVariables(rawPdbFile, dbiStream, tpiStream); - ExampleLines(rawPdbFile, dbiStream, infoStream); - ExampleTypes(tpiStream); - ExampleIPI(rawPdbFile, infoStream, tpiStream, ipiStream); - // uncomment to dump type sizes to a CSV - // ExampleTPISize(tpiStream, "output.csv"); - - MemoryMappedFile::Close(pdbFile); - - return 0; -} diff --git a/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.cpp b/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.cpp deleted file mode 100644 index 4b46b4b..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleMemoryMappedFile.h" - - -MemoryMappedFile::Handle MemoryMappedFile::Open(const char* path) -{ -#ifdef _WIN32 - void* file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, nullptr); - - if (file == INVALID_HANDLE_VALUE) - { - return Handle { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - void* fileMapping = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr); - - if (fileMapping == nullptr) - { - CloseHandle(file); - - return Handle { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - void* baseAddress = MapViewOfFile(fileMapping, FILE_MAP_READ, 0, 0, 0); - - if (baseAddress == nullptr) - { - CloseHandle(fileMapping); - CloseHandle(file); - - return Handle { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - BY_HANDLE_FILE_INFORMATION fileInformation; - const bool getInformationResult = GetFileInformationByHandle(file, &fileInformation); - if (!getInformationResult) - { - UnmapViewOfFile(baseAddress); - CloseHandle(fileMapping); - CloseHandle(file); - - return Handle { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - const size_t fileSizeHighBytes = static_cast(fileInformation.nFileSizeHigh) << 32; - const size_t fileSizeLowBytes = fileInformation.nFileSizeLow; - const size_t fileSize = fileSizeHighBytes | fileSizeLowBytes; - return Handle { file, fileMapping, baseAddress, fileSize }; -#else - struct stat fileSb; - - int file = open(path, O_RDONLY); - - if (file == INVALID_HANDLE_VALUE) - { - return Handle { INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - if (fstat(file, &fileSb) == -1) - { - close(file); - - return Handle { INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - void* baseAddress = mmap(nullptr, fileSb.st_size, PROT_READ, MAP_PRIVATE, file, 0); - - if (baseAddress == MAP_FAILED) - { - close(file); - - return Handle { INVALID_HANDLE_VALUE, nullptr, 0 }; - } - - return Handle { file, baseAddress, static_cast(fileSb.st_size) }; -#endif -} - - -void MemoryMappedFile::Close(Handle& handle) -{ -#ifdef _WIN32 - UnmapViewOfFile(handle.baseAddress); - CloseHandle(handle.fileMapping); - CloseHandle(handle.file); - - handle.file = nullptr; - handle.fileMapping = nullptr; -#else - munmap(handle.baseAddress, handle.len); - close(handle.file); - - handle.file = 0; -#endif - - handle.baseAddress = nullptr; -} diff --git a/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.h b/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.h deleted file mode 100644 index c145753..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleMemoryMappedFile.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#ifndef _WIN32 -#include -#include -#include -#include - -#define INVALID_HANDLE_VALUE ((long)-1) -#endif - -namespace MemoryMappedFile -{ - struct Handle - { -#ifdef _WIN32 - void* file; - void* fileMapping; -#else - int file; -#endif - void* baseAddress; - size_t len; - }; - - Handle Open(const char* path); - void Close(Handle& handle); -} diff --git a/third_party/raw_pdb/src/Examples/ExamplePDBSize.cpp b/third_party/raw_pdb/src/Examples/ExamplePDBSize.cpp deleted file mode 100644 index c0a4dc6..0000000 --- a/third_party/raw_pdb/src/Examples/ExamplePDBSize.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" - - -namespace -{ - struct Stream - { - std::string name; - uint32_t size; - }; -} - - -void ExamplePDBSize(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream); -void ExamplePDBSize(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) -{ - TimedScope total("\nRunning example \"PDBSize\""); - - std::vector streams; - - // print show general statistics - printf("General\n"); - printf("-------\n"); - { - const PDB::SuperBlock* superBlock = rawPdbFile.GetSuperBlock(); - printf("PDB page size (block size): %u\n", superBlock->blockSize); - printf("PDB block count: %u\n", superBlock->blockCount); - - const size_t rawSize = static_cast(superBlock->blockSize) * static_cast(superBlock->blockCount); - printf("PDB raw size: %zu MiB (%zu GiB)\n", rawSize >> 20u, rawSize >> 30u); - } - - // print the sizes of all known streams - printf("\n"); - printf("Sizes of known streams\n"); - printf("----------------------\n"); - { - const uint32_t streamCount = rawPdbFile.GetStreamCount(); - const uint32_t tpiStreamSize = (streamCount > 2u) ? rawPdbFile.GetStreamSize(2u) : 0u; - const uint32_t dbiStreamSize = (streamCount > 3u) ? rawPdbFile.GetStreamSize(3u) : 0u; - const uint32_t ipiStreamSize = (streamCount > 4u) ? rawPdbFile.GetStreamSize(4u) : 0u; - - printf("TPI stream size: %u KiB (%u MiB)\n", tpiStreamSize >> 10u, tpiStreamSize >> 20u); - printf("DBI stream size: %u KiB (%u MiB)\n", dbiStreamSize >> 10u, dbiStreamSize >> 20u); - printf("IPI stream size: %u KiB (%u MiB)\n", ipiStreamSize >> 10u, ipiStreamSize >> 20u); - - streams.push_back(Stream { "TPI", tpiStreamSize }); - streams.push_back(Stream { "DBI", dbiStreamSize }); - streams.push_back(Stream { "IPI", ipiStreamSize }); - - const uint32_t globalSymbolStreamSize = rawPdbFile.GetStreamSize(dbiStream.GetHeader().globalStreamIndex); - const uint32_t publicSymbolStreamSize = rawPdbFile.GetStreamSize(dbiStream.GetHeader().publicStreamIndex); - const uint32_t symbolRecordStreamSize = rawPdbFile.GetStreamSize(dbiStream.GetHeader().symbolRecordStreamIndex); - - printf("Global symbol stream size: %u KiB (%u MiB)\n", globalSymbolStreamSize >> 10u, globalSymbolStreamSize >> 20u); - printf("Public symbol stream size: %u KiB (%u MiB)\n", publicSymbolStreamSize >> 10u, publicSymbolStreamSize >> 20u); - printf("Symbol record stream size: %u KiB (%u MiB)\n", symbolRecordStreamSize >> 10u, symbolRecordStreamSize >> 20u); - - streams.emplace_back(Stream { "Global", globalSymbolStreamSize }); - streams.emplace_back(Stream { "Public", publicSymbolStreamSize }); - streams.emplace_back(Stream { "Symbol", symbolRecordStreamSize }); - } - - // print the sizes of all module streams - printf("\n"); - printf("Sizes of module streams\n"); - printf("-----------------------\n"); - { - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - const PDB::ArrayView modules = moduleInfoStream.GetModules(); - - for (const PDB::ModuleInfoStream::Module& module : modules) - { - const PDB::DBI::ModuleInfo* moduleInfo = module.GetInfo(); - const char* name = module.GetName().Decay(); - const char* objectName = module.GetObjectName().Decay(); - - const uint16_t streamIndex = module.HasSymbolStream() ? moduleInfo->moduleSymbolStreamIndex : 0u; - const uint32_t moduleStreamSize = (streamIndex != 0u) ? rawPdbFile.GetStreamSize(streamIndex) : 0u; - - printf("Module %s (%s) stream size: %u KiB (%u MiB)\n", name, objectName, moduleStreamSize >> 10u, moduleStreamSize >> 20u); - - streams.push_back(Stream { name, moduleStreamSize }); - } - } - - // sort the streams by their size - std::sort(streams.begin(), streams.end(), [](const Stream& lhs, const Stream& rhs) - { - return lhs.size > rhs.size; - }); - - // log the 20 largest stream - { - printf("\n"); - printf("Sizes of 20 largest streams:\n"); - - const size_t countToShow = std::min(20ul, streams.size()); - for (size_t i = 0u; i < countToShow; ++i) - { - const Stream& stream = streams[i]; - printf("%zu: %u KiB (%u MiB) from stream %s\n", i + 1u, stream.size >> 10u, stream.size >> 20u, stream.name.c_str()); - } - } - - // print the raw stream sizes - printf("\n"); - printf("Raw sizes of all streams\n"); - printf("------------------------\n"); - { - const uint32_t streamCount = rawPdbFile.GetStreamCount(); - for (uint32_t i = 0u; i < streamCount; ++i) - { - const uint32_t streamSize = rawPdbFile.GetStreamSize(i); - printf("Stream %u size: %u KiB (%u MiB)\n", i, streamSize >> 10u, streamSize >> 20u); - } - } -} diff --git a/third_party/raw_pdb/src/Examples/ExampleSymbols.cpp b/third_party/raw_pdb/src/Examples/ExampleSymbols.cpp deleted file mode 100644 index c1b2ef8..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleSymbols.cpp +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" - - -namespace -{ - // we don't have to store std::string in the symbols, since all the data is memory-mapped anyway. - // we do it in this example to ensure that we don't "cheat" when reading the PDB file. memory-mapped data will only - // be faulted into the process once it's touched, so actually copying the string data makes us touch the needed data, - // giving us a real performance measurement. - struct Symbol - { - std::string name; - uint32_t rva; - }; -} - - -void ExampleSymbols(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream); -void ExampleSymbols(const PDB::RawFile& rawPdbFile, const PDB::DBIStream& dbiStream) -{ - TimedScope total("\nRunning example \"Symbols\""); - - // in order to keep the example easy to understand, we load the PDB data serially. - // note that this can be improved a lot by reading streams concurrently. - - // prepare the image section stream first. it is needed for converting section + offset into an RVA - TimedScope sectionScope("Reading image section stream"); - const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawPdbFile); - sectionScope.Done(); - - - // prepare the module info stream for matching contributions against files - TimedScope moduleScope("Reading module info stream"); - const PDB::ModuleInfoStream moduleInfoStream = dbiStream.CreateModuleInfoStream(rawPdbFile); - moduleScope.Done(); - - - // prepare symbol record stream needed by both public and global streams - TimedScope symbolStreamScope("Reading symbol record stream"); - const PDB::CoalescedMSFStream symbolRecordStream = dbiStream.CreateSymbolRecordStream(rawPdbFile); - symbolStreamScope.Done(); - - std::vector symbols; - - // read public symbols - TimedScope publicScope("Reading public symbol stream"); - const PDB::PublicSymbolStream publicSymbolStream = dbiStream.CreatePublicSymbolStream(rawPdbFile); - publicScope.Done(); - { - TimedScope scope("Storing public symbols"); - - const PDB::ArrayView hashRecords = publicSymbolStream.GetRecords(); - const size_t count = hashRecords.GetLength(); - - symbols.reserve(count); - - for (const PDB::HashRecord& hashRecord : hashRecords) - { - const PDB::CodeView::DBI::Record* record = publicSymbolStream.GetRecord(symbolRecordStream, hashRecord); - if (record->header.kind != PDB::CodeView::DBI::SymbolRecordKind::S_PUB32) - { - // normally, a PDB only contains S_PUB32 symbols in the public symbol stream, but we have seen PDBs that also store S_CONSTANT as public symbols. - // ignore these. - continue; - } - - const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_PUB32.section, record->data.S_PUB32.offset); - if (rva == 0u) - { - // certain symbols (e.g. control-flow guard symbols) don't have a valid RVA, ignore those - continue; - } - - symbols.push_back(Symbol { record->data.S_PUB32.name, rva }); - } - - scope.Done(count); - } - - - // read global symbols - TimedScope globalScope("Reading global symbol stream"); - const PDB::GlobalSymbolStream globalSymbolStream = dbiStream.CreateGlobalSymbolStream(rawPdbFile); - globalScope.Done(); - { - TimedScope scope("Storing global symbols"); - - const PDB::ArrayView hashRecords = globalSymbolStream.GetRecords(); - const size_t count = hashRecords.GetLength(); - - symbols.reserve(symbols.size() + count); - - for (const PDB::HashRecord& hashRecord : hashRecords) - { - const PDB::CodeView::DBI::Record* record = globalSymbolStream.GetRecord(symbolRecordStream, hashRecord); - - const char* name = nullptr; - uint32_t rva = 0u; - if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GDATA32) - { - name = record->data.S_GDATA32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GDATA32.section, record->data.S_GDATA32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GTHREAD32) - { - name = record->data.S_GTHREAD32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GTHREAD32.section, record->data.S_GTHREAD32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LDATA32) - { - name = record->data.S_LDATA32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LDATA32.section, record->data.S_LDATA32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LTHREAD32) - { - name = record->data.S_LTHREAD32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LTHREAD32.section, record->data.S_LTHREAD32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_UDT) - { - name = record->data.S_UDT.name; - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_UDT_ST) - { - name = record->data.S_UDT_ST.name; - } - - if (rva == 0u) - { - // certain symbols (e.g. control-flow guard symbols) don't have a valid RVA, ignore those - continue; - } - - symbols.push_back(Symbol { name, rva }); - } - - scope.Done(count); - } - - - // read module symbols - { - TimedScope scope("Storing symbols from modules"); - - const PDB::ArrayView modules = moduleInfoStream.GetModules(); - - for (const PDB::ModuleInfoStream::Module& module : modules) - { - if (!module.HasSymbolStream()) - { - continue; - } - - const PDB::ModuleSymbolStream moduleSymbolStream = module.CreateSymbolStream(rawPdbFile); - moduleSymbolStream.ForEachSymbol([&symbols, &imageSectionStream](const PDB::CodeView::DBI::Record* record) - { - const char* name = nullptr; - uint32_t rva = 0u; - if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_THUNK32) - { - if (record->data.S_THUNK32.thunk == PDB::CodeView::DBI::ThunkOrdinal::TrampolineIncremental) - { - // we have never seen incremental linking thunks stored inside a S_THUNK32 symbol, but better be safe than sorry - name = "ILT"; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_THUNK32.section, record->data.S_THUNK32.offset); - } - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_TRAMPOLINE) - { - // incremental linking thunks are stored in the linker module - name = "ILT"; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_TRAMPOLINE.thunkSection, record->data.S_TRAMPOLINE.thunkOffset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_BLOCK32) - { - // blocks never store a name and are only stored for indicating whether other symbols are children of this block - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LABEL32) - { - // labels don't have a name - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32) - { - name = record->data.S_LPROC32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LPROC32.section, record->data.S_LPROC32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GPROC32) - { - name = record->data.S_GPROC32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GPROC32.section, record->data.S_GPROC32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LPROC32_ID) - { - name = record->data.S_LPROC32_ID.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LPROC32_ID.section, record->data.S_LPROC32_ID.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GPROC32_ID) - { - name = record->data.S_GPROC32_ID.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_GPROC32_ID.section, record->data.S_GPROC32_ID.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_REGREL32) - { - name = record->data.S_REGREL32.name; - // You can only get the address while running the program by checking the register value and adding the offset - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LDATA32) - { - name = record->data.S_LDATA32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LDATA32.section, record->data.S_LDATA32.offset); - } - else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LTHREAD32) - { - name = record->data.S_LTHREAD32.name; - rva = imageSectionStream.ConvertSectionOffsetToRVA(record->data.S_LTHREAD32.section, record->data.S_LTHREAD32.offset); - } - - if (rva == 0u) - { - // certain symbols (e.g. control-flow guard symbols) don't have a valid RVA, ignore those - return; - } - - symbols.push_back(Symbol { name, rva }); - }); - } - - scope.Done(modules.GetLength()); - } - - total.Done(symbols.size()); -} diff --git a/third_party/raw_pdb/src/Examples/ExampleTimedScope.cpp b/third_party/raw_pdb/src/Examples/ExampleTimedScope.cpp deleted file mode 100644 index 74b3fb0..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleTimedScope.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" - -namespace -{ - static unsigned int g_indent = 0u; - - static void PrintIndent(void) - { - printf("%.*s", g_indent * 2u, "| | | | | | | | "); - } -} - - -TimedScope::TimedScope(const char* message) - : m_begin(std::chrono::high_resolution_clock::now()) -{ - PrintIndent(); - ++g_indent; - - printf("%s\n", message); -} - - -void TimedScope::Done(void) const -{ - --g_indent; - PrintIndent(); - - const double milliSeconds = ReadMilliseconds(); - printf("---> done in %.3fms\n", milliSeconds); -} - - -void TimedScope::Done(size_t count) const -{ - --g_indent; - PrintIndent(); - - const double milliSeconds = ReadMilliseconds(); - printf("---> done in %.3fms (%zu elements)\n", milliSeconds, count); -} - - -double TimedScope::ReadMilliseconds(void) const -{ - const std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now(); - const std::chrono::duration seconds = now - m_begin; - - return seconds.count() * 1000.0; -} diff --git a/third_party/raw_pdb/src/Examples/ExampleTimedScope.h b/third_party/raw_pdb/src/Examples/ExampleTimedScope.h deleted file mode 100644 index 0488dbb..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleTimedScope.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Foundation/PDB_Macros.h" -#include - - -class TimedScope -{ -public: - explicit TimedScope(const char* message); - - void Done(void) const; - void Done(size_t count) const; - -private: - double ReadMilliseconds(void) const; - - const std::chrono::high_resolution_clock::time_point m_begin; - - PDB_DISABLE_COPY_MOVE(TimedScope); -}; diff --git a/third_party/raw_pdb/src/Examples/ExampleTypeTable.cpp b/third_party/raw_pdb/src/Examples/ExampleTypeTable.cpp deleted file mode 100644 index 260b4d2..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleTypeTable.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" -#include "ExampleTypeTable.h" -#include "Foundation/PDB_Memory.h" - -TypeTable::TypeTable(const PDB::TPIStream& tpiStream) PDB_NO_EXCEPT - : typeIndexBegin(tpiStream.GetFirstTypeIndex()), typeIndexEnd(tpiStream.GetLastTypeIndex()), - m_recordCount(tpiStream.GetTypeRecordCount()) -{ - // Create coalesced stream from TPI stream, so the records can be referenced directly using pointers. - const PDB::DirectMSFStream& directStream = tpiStream.GetDirectMSFStream(); - m_stream = PDB::CoalescedMSFStream(directStream, directStream.GetSize(), 0); - - // types in the TPI stream are accessed by their index from other streams. - // however, the index is not stored with types in the TPI stream directly, but has to be built while walking the stream. - // similarly, because types are variable-length records, there are no direct offsets to access individual types. - // we therefore walk the TPI stream once, and store pointers to the records for trivial O(1) array lookup by index later. - m_records = PDB_NEW_ARRAY(const PDB::CodeView::TPI::Record*, m_recordCount); - - // parse the CodeView records - uint32_t typeIndex = 0u; - - tpiStream.ForEachTypeRecordHeaderAndOffset([this, &typeIndex](const PDB::CodeView::TPI::RecordHeader& header, size_t offset) - { - // The header includes the record kind and size, which can be stored along with offset - // to allow for lazy loading of the types on-demand directly from the TPIStream::GetDirectMSFStream() - // using DirectMSFStream::ReadAtOffset(...). Thus not needing a CoalescedMSFStream to look up the types. - (void)header; - - const PDB::CodeView::TPI::Record* record = m_stream.GetDataAtOffset(offset); - m_records[typeIndex] = record; - ++typeIndex; - }); -} - -TypeTable::~TypeTable() PDB_NO_EXCEPT -{ - PDB_DELETE_ARRAY(m_records); -} diff --git a/third_party/raw_pdb/src/Examples/ExampleTypeTable.h b/third_party/raw_pdb/src/Examples/ExampleTypeTable.h deleted file mode 100644 index 7448952..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleTypeTable.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "PDB_TPIStream.h" -#include "PDB_CoalescedMSFStream.h" - -class TypeTable -{ -public: - explicit TypeTable(const PDB::TPIStream& tpiStream) PDB_NO_EXCEPT; - ~TypeTable() PDB_NO_EXCEPT; - - // Returns the index of the first type, which is not necessarily zero. - PDB_NO_DISCARD inline uint32_t GetFirstTypeIndex(void) const PDB_NO_EXCEPT - { - return typeIndexBegin; - } - - // Returns the index of the last type. - PDB_NO_DISCARD inline uint32_t GetLastTypeIndex(void) const PDB_NO_EXCEPT - { - return typeIndexEnd; - } - - PDB_NO_DISCARD inline const PDB::CodeView::TPI::Record* GetTypeRecord(uint32_t typeIndex) const PDB_NO_EXCEPT - { - if (typeIndex < typeIndexBegin || typeIndex > typeIndexEnd) - return nullptr; - - return m_records[typeIndex - typeIndexBegin]; - } - - // Returns a view of all type records. - // Records identified by a type index can be accessed via "allRecords[typeIndex - firstTypeIndex]". - PDB_NO_DISCARD inline PDB::ArrayView GetTypeRecords(void) const PDB_NO_EXCEPT - { - return PDB::ArrayView(m_records, m_recordCount); - } - -private: - uint32_t typeIndexBegin; - uint32_t typeIndexEnd; - - size_t m_recordCount; - const PDB::CodeView::TPI::Record **m_records; - - PDB::CoalescedMSFStream m_stream; - - PDB_DISABLE_COPY(TypeTable); -}; diff --git a/third_party/raw_pdb/src/Examples/ExampleTypes.cpp b/third_party/raw_pdb/src/Examples/ExampleTypes.cpp deleted file mode 100644 index cd30b22..0000000 --- a/third_party/raw_pdb/src/Examples/ExampleTypes.cpp +++ /dev/null @@ -1,1418 +0,0 @@ - -#include "Examples_PCH.h" -#include "ExampleTimedScope.h" -#include "ExampleTypeTable.h" -#include "PDB_RawFile.h" -#include "PDB_DBIStream.h" -#include "PDB_TPIStream.h" -#include -#include - -// not all enumeration values are handled explicitly by some of the switch statements -PDB_DISABLE_WARNING_MSVC(4061) -PDB_DISABLE_WARNING_CLANG("-Wswitch-enum") - -// some format strings are not string literals -PDB_DISABLE_WARNING_MSVC(4774) -PDB_DISABLE_WARNING_CLANG("-Wformat-nonliteral") - -std::string GetTypeName(const TypeTable& typeTable, uint32_t typeIndex); - -static uint8_t GetLeafSize(PDB::CodeView::TPI::TypeRecordKind kind) -{ - if (kind < PDB::CodeView::TPI::TypeRecordKind::LF_NUMERIC) - { - // No leaf can have an index less than LF_NUMERIC (0x8000) - // so word is the value... - return sizeof(PDB::CodeView::TPI::TypeRecordKind); - } - - switch (kind) - { - case PDB::CodeView::TPI::TypeRecordKind::LF_CHAR: - return sizeof(PDB::CodeView::TPI::TypeRecordKind) + sizeof(uint8_t); - - case PDB::CodeView::TPI::TypeRecordKind::LF_USHORT: - case PDB::CodeView::TPI::TypeRecordKind::LF_SHORT: - return sizeof(PDB::CodeView::TPI::TypeRecordKind) + sizeof(uint16_t); - - case PDB::CodeView::TPI::TypeRecordKind::LF_LONG: - case PDB::CodeView::TPI::TypeRecordKind::LF_ULONG: - return sizeof(PDB::CodeView::TPI::TypeRecordKind) + sizeof(uint32_t); - - case PDB::CodeView::TPI::TypeRecordKind::LF_QUADWORD: - case PDB::CodeView::TPI::TypeRecordKind::LF_UQUADWORD: - return sizeof(PDB::CodeView::TPI::TypeRecordKind) + sizeof(uint64_t); - - default: - printf("Error! 0x%04x bogus type encountered, aborting...\n", PDB_AS_UNDERLYING(kind)); - } - return 0; -} - - -static const char* GetLeafName(const char* data, PDB::CodeView::TPI::TypeRecordKind kind) -{ - return &data[GetLeafSize(kind)]; -} - - -static const char* GetTypeName(const TypeTable& typeTable, uint32_t typeIndex, uint8_t& pointerLevel, const PDB::CodeView::TPI::Record** referencedType, const PDB::CodeView::TPI::Record** modifierRecord) -{ - const char* typeName = nullptr; - const PDB::CodeView::TPI::Record* underlyingType = nullptr; - - if (referencedType) - *referencedType = nullptr; - - if (modifierRecord) - *modifierRecord = nullptr; - - auto typeIndexBegin = typeTable.GetFirstTypeIndex(); - if (typeIndex < typeIndexBegin) - { - auto type = static_cast(typeIndex); - switch (type) - { - case PDB::CodeView::TPI::TypeIndexKind::T_NOTYPE: - return ""; - case PDB::CodeView::TPI::TypeIndexKind::T_HRESULT: - return "HRESULT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PHRESULT: - case PDB::CodeView::TPI::TypeIndexKind::T_64PHRESULT: - return "PHRESULT"; - - case PDB::CodeView::TPI::TypeIndexKind::T_UNKNOWN_0600: - return "UNKNOWN_0x0600"; - - case PDB::CodeView::TPI::TypeIndexKind::T_VOID: - return "void"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PVOID: - case PDB::CodeView::TPI::TypeIndexKind::T_64PVOID: - case PDB::CodeView::TPI::TypeIndexKind::T_PVOID: - return "PVOID"; - - case PDB::CodeView::TPI::TypeIndexKind::T_32PBOOL08: - case PDB::CodeView::TPI::TypeIndexKind::T_32PBOOL16: - case PDB::CodeView::TPI::TypeIndexKind::T_32PBOOL32: - case PDB::CodeView::TPI::TypeIndexKind::T_32PBOOL64: - case PDB::CodeView::TPI::TypeIndexKind::T_64PBOOL08: - case PDB::CodeView::TPI::TypeIndexKind::T_64PBOOL16: - case PDB::CodeView::TPI::TypeIndexKind::T_64PBOOL32: - case PDB::CodeView::TPI::TypeIndexKind::T_64PBOOL64: - return "PBOOL"; - - case PDB::CodeView::TPI::TypeIndexKind::T_BOOL08: - case PDB::CodeView::TPI::TypeIndexKind::T_BOOL16: - case PDB::CodeView::TPI::TypeIndexKind::T_BOOL32: - return "BOOL"; - - case PDB::CodeView::TPI::TypeIndexKind::T_RCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_CHAR: - return "CHAR"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PRCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_32PCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_64PRCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_64PCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_PRCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_PCHAR: - return "PCHAR"; - - case PDB::CodeView::TPI::TypeIndexKind::T_UCHAR: - return "UCHAR"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PUCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_PUCHAR: - return "PUCHAR"; - - case PDB::CodeView::TPI::TypeIndexKind::T_WCHAR: - return "WCHAR"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PWCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_64PWCHAR: - case PDB::CodeView::TPI::TypeIndexKind::T_PWCHAR: - return "PWCHAR"; - - case PDB::CodeView::TPI::TypeIndexKind::T_CHAR8: - return "CHAR8"; - case PDB::CodeView::TPI::TypeIndexKind::T_PCHAR8: - case PDB::CodeView::TPI::TypeIndexKind::T_PFCHAR8: - case PDB::CodeView::TPI::TypeIndexKind::T_PHCHAR8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PCHAR8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PFCHAR8: - case PDB::CodeView::TPI::TypeIndexKind::T_64PCHAR8: - return "PCHAR8"; - - case PDB::CodeView::TPI::TypeIndexKind::T_CHAR16: - return "CHAR16"; - case PDB::CodeView::TPI::TypeIndexKind::T_PCHAR16: - case PDB::CodeView::TPI::TypeIndexKind::T_32PCHAR16: - case PDB::CodeView::TPI::TypeIndexKind::T_64PCHAR16: - return "PCHAR16"; - - case PDB::CodeView::TPI::TypeIndexKind::T_CHAR32: - return "CHAR32"; - case PDB::CodeView::TPI::TypeIndexKind::T_PCHAR32: - case PDB::CodeView::TPI::TypeIndexKind::T_32PCHAR32: - case PDB::CodeView::TPI::TypeIndexKind::T_64PCHAR32: - return "PCHAR32"; - - case PDB::CodeView::TPI::TypeIndexKind::T_SHORT: - return "SHORT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PSHORT: - case PDB::CodeView::TPI::TypeIndexKind::T_64PSHORT: - case PDB::CodeView::TPI::TypeIndexKind::T_PSHORT: - return "PSHORT"; - case PDB::CodeView::TPI::TypeIndexKind::T_USHORT: - return "USHORT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PUSHORT: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUSHORT: - case PDB::CodeView::TPI::TypeIndexKind::T_PUSHORT: - return "PUSHORT"; - case PDB::CodeView::TPI::TypeIndexKind::T_LONG: - return "LONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PLONG: - case PDB::CodeView::TPI::TypeIndexKind::T_64PLONG: - case PDB::CodeView::TPI::TypeIndexKind::T_PLONG: - return "PLONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_ULONG: - return "ULONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PULONG: - case PDB::CodeView::TPI::TypeIndexKind::T_64PULONG: - case PDB::CodeView::TPI::TypeIndexKind::T_PULONG: - return "PULONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_REAL32: - return "FLOAT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PREAL32: - case PDB::CodeView::TPI::TypeIndexKind::T_64PREAL32: - case PDB::CodeView::TPI::TypeIndexKind::T_PREAL32: - return "PFLOAT"; - case PDB::CodeView::TPI::TypeIndexKind::T_REAL64: - return "DOUBLE"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PREAL64: - case PDB::CodeView::TPI::TypeIndexKind::T_64PREAL64: - case PDB::CodeView::TPI::TypeIndexKind::T_PREAL64: - return "PDOUBLE"; - case PDB::CodeView::TPI::TypeIndexKind::T_REAL80: - return "REAL80"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PREAL80: - case PDB::CodeView::TPI::TypeIndexKind::T_64PREAL80: - case PDB::CodeView::TPI::TypeIndexKind::T_PREAL80: - return "PREAL80"; - case PDB::CodeView::TPI::TypeIndexKind::T_QUAD: - return "LONGLONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PQUAD: - case PDB::CodeView::TPI::TypeIndexKind::T_64PQUAD: - case PDB::CodeView::TPI::TypeIndexKind::T_PQUAD: - return "PLONGLONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_UQUAD: - return "ULONGLONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PUQUAD: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUQUAD: - case PDB::CodeView::TPI::TypeIndexKind::T_PUQUAD: - return "PULONGLONG"; - case PDB::CodeView::TPI::TypeIndexKind::T_INT4: - return "INT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PINT4: - case PDB::CodeView::TPI::TypeIndexKind::T_64PINT4: - case PDB::CodeView::TPI::TypeIndexKind::T_PINT4: - return "PINT"; - case PDB::CodeView::TPI::TypeIndexKind::T_UINT4: - return "UINT"; - case PDB::CodeView::TPI::TypeIndexKind::T_32PUINT4: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUINT4: - case PDB::CodeView::TPI::TypeIndexKind::T_PUINT4: - return "PUINT"; - - case PDB::CodeView::TPI::TypeIndexKind::T_UINT8: - return "UINT8"; - case PDB::CodeView::TPI::TypeIndexKind::T_PUINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_PFUINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_PHUINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PUINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PFUINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUINT8: - return "PUINT8"; - - case PDB::CodeView::TPI::TypeIndexKind::T_INT8: - return "INT8"; - case PDB::CodeView::TPI::TypeIndexKind::T_PINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_PFINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_PHINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_32PFINT8: - case PDB::CodeView::TPI::TypeIndexKind::T_64PINT8: - return "PINT8"; - - case PDB::CodeView::TPI::TypeIndexKind::T_OCT: - return "OCTAL"; - - case PDB::CodeView::TPI::TypeIndexKind::T_POCT: - case PDB::CodeView::TPI::TypeIndexKind::T_PFOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_PHOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_32POCT: - case PDB::CodeView::TPI::TypeIndexKind::T_32PFOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_64POCT: - return "POCTAL"; - - case PDB::CodeView::TPI::TypeIndexKind::T_UOCT: - return "UOCTAL"; - - case PDB::CodeView::TPI::TypeIndexKind::T_PUOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_PFUOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_PHUOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_32PUOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_32PFUOCT: - case PDB::CodeView::TPI::TypeIndexKind::T_64PUOCT: - return "PUOCTAL"; - - default: - PDB_ASSERT(false, "Unhandled special type 0x%X", typeIndex); - return "unhandled_special_type"; - } - } - else - { - auto typeRecord = typeTable.GetTypeRecord(typeIndex); - if (!typeRecord) - return nullptr; - - switch (typeRecord->header.kind) - { - case PDB::CodeView::TPI::TypeRecordKind::LF_MODIFIER: - if(modifierRecord) - *modifierRecord = typeRecord; - return GetTypeName(typeTable, typeRecord->data.LF_MODIFIER.type, pointerLevel, referencedType, nullptr); - case PDB::CodeView::TPI::TypeRecordKind::LF_POINTER: - ++pointerLevel; - if(referencedType) - *referencedType = typeRecord; - if (typeRecord->data.LF_POINTER.utype >= typeIndexBegin) - { - underlyingType = typeTable.GetTypeRecord(typeRecord->data.LF_POINTER.utype); - if (!underlyingType) - return nullptr; - - if(underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_POINTER) - return GetTypeName(typeTable, typeRecord->data.LF_POINTER.utype, pointerLevel, referencedType, modifierRecord); - - // Type record order can be LF_POINTER -> LF_MODIFIER -> LF_POINTER -> ... - if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MODIFIER) - { - if (modifierRecord) - *modifierRecord = underlyingType; - - return GetTypeName(typeTable, underlyingType->data.LF_MODIFIER.type, pointerLevel, referencedType, nullptr); - } - } - - return GetTypeName(typeTable, typeRecord->data.LF_POINTER.utype, pointerLevel, &typeRecord, modifierRecord); - case PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE: - if (referencedType) - *referencedType = typeRecord; - return nullptr; - case PDB::CodeView::TPI::TypeRecordKind::LF_BITFIELD: - if (typeRecord->data.LF_BITFIELD.type < typeIndexBegin) - { - typeName = GetTypeName(typeTable, typeRecord->data.LF_BITFIELD.type, pointerLevel, nullptr, modifierRecord); - if (referencedType) - *referencedType = typeRecord; - return typeName; - } - else - { - if (referencedType) - *referencedType = typeRecord; - return nullptr; - } - case PDB::CodeView::TPI::TypeRecordKind::LF_ARRAY: - if (referencedType) - *referencedType = typeRecord; - return GetTypeName(typeTable, typeRecord->data.LF_ARRAY.elemtype, pointerLevel, &typeRecord, modifierRecord); - case PDB::CodeView::TPI::TypeRecordKind::LF_CLASS: - case PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE: - return GetLeafName(typeRecord->data.LF_CLASS.data, typeRecord->header.kind); - - case PDB::CodeView::TPI::TypeRecordKind::LF_CLASS2: - case PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE2: - return GetLeafName(typeRecord->data.LF_CLASS2.data, typeRecord->header.kind); - - case PDB::CodeView::TPI::TypeRecordKind::LF_UNION: - return GetLeafName(typeRecord->data.LF_UNION.data, typeRecord->header.kind); - case PDB::CodeView::TPI::TypeRecordKind::LF_ENUM: - return &typeRecord->data.LF_ENUM.name[0]; - case PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION: - if (referencedType) - *referencedType = typeRecord; - return nullptr; - - default: - PDB_ASSERT(false, "Unhandled TypeRecordKind 0x%X", static_cast(typeRecord->header.kind)); - break; - } - - } - - return "unknown_type"; -} - -static const char* GetModifierName(const PDB::CodeView::TPI::Record* modifierRecord) -{ - if (modifierRecord->data.LF_MODIFIER.attr.MOD_const) - return "const"; - else if (modifierRecord->data.LF_MODIFIER.attr.MOD_volatile) - return "volatile"; - else if (modifierRecord->data.LF_MODIFIER.attr.MOD_unaligned) - return "unaligned"; - - return ""; -} - -static bool GetMethodPrototype(const TypeTable& typeTable, const PDB::CodeView::TPI::Record* methodRecord, std::string& methodPrototype); - -static bool GetFunctionPrototype(const TypeTable& typeTable, const PDB::CodeView::TPI::Record* functionRecord, std::string& functionPrototype) -{ - PDB_ASSERT(functionRecord->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE, "TPI Record kind is 0x%X, expected 0x%X (LF_PROCEDURE)", - (uint32_t)functionRecord->header.kind, (uint32_t)PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE); - - std::string underlyingTypePrototype; - - size_t markerPos = 0; - uint8_t pointerLevel = 0; - const PDB::CodeView::TPI::Record* referencedType = nullptr; - const PDB::CodeView::TPI::Record* underlyingType = nullptr; - const PDB::CodeView::TPI::Record* modifierRecord = nullptr; - - functionPrototype.clear(); - - auto typeName = GetTypeName(typeTable, functionRecord->data.LF_PROCEDURE.rvtype, pointerLevel, &referencedType, &modifierRecord); - if (typeName) - { - if (modifierRecord) - { - functionPrototype += GetModifierName(modifierRecord); - functionPrototype += ' '; - } - - functionPrototype += typeName; - - for (size_t i = 0; i < pointerLevel; i++) - functionPrototype += '*'; - } - else - { - PDB_ASSERT(referencedType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_POINTER, "Referenced type kind 0x%X != LF_POINTER (0x%X)", (uint32_t)referencedType->header.kind, (uint32_t)PDB::CodeView::TPI::TypeRecordKind::LF_POINTER); - - underlyingType = typeTable.GetTypeRecord(referencedType->data.LF_POINTER.utype); - if (!underlyingType) - return false; - - if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - if (!GetFunctionPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - } - else if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - if (!GetMethodPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - } - else - { - PDB_ASSERT(false, "Unhandled underlyingType kind 0x%X", (uint32_t)underlyingType->header.kind); - } - - markerPos = underlyingTypePrototype.find("%s"); - underlyingTypePrototype.erase(markerPos, 2); - functionPrototype = underlyingTypePrototype; - } - - functionPrototype += " (*%s)("; - - if (functionRecord->data.LF_PROCEDURE.parmcount) - { - auto argList = typeTable.GetTypeRecord(functionRecord->data.LF_PROCEDURE.arglist); - if (!argList) - return false; - - for (size_t i = 0; i < argList->data.LF_ARGLIST.count; i++) - { - pointerLevel = 0; - typeName = GetTypeName(typeTable, argList->data.LF_ARGLIST.arg[i], pointerLevel, &referencedType, &modifierRecord); - if (referencedType) - { - if (referencedType->data.LF_POINTER.utype >= typeTable.GetFirstTypeIndex()) - { - underlyingType = typeTable.GetTypeRecord(referencedType->data.LF_POINTER.utype); - if (!underlyingType) - return false; - } - - if (!underlyingType || (underlyingType->header.kind != PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE && underlyingType->header.kind != PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION)) - { - if (modifierRecord) - { - functionPrototype += GetModifierName(modifierRecord); - functionPrototype += ' '; - } - - functionPrototype += typeName; - functionPrototype += '*'; - - if (referencedType->data.LF_POINTER.attr.isvolatile) - functionPrototype += "volatile"; - else if (referencedType->data.LF_POINTER.attr.isconst) - functionPrototype += "const"; - } - else if(underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - if (!GetFunctionPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - - markerPos = underlyingTypePrototype.find("%s"); - underlyingTypePrototype.erase(markerPos, 2); - - for (size_t j = 1; j < pointerLevel; j++) - underlyingTypePrototype.insert(markerPos, 1, '*'); - - functionPrototype += underlyingTypePrototype; - } - else if(underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - functionPrototype += GetTypeName(typeTable, argList->data.LF_ARGLIST.arg[i]); - } - } - else - { - functionPrototype += typeName; - } - - if (i < (argList->data.LF_ARGLIST.count - 1)) - functionPrototype += ", "; - } - } - - functionPrototype += ')'; - - return true; -} - - -static bool GetMethodPrototype(const TypeTable& typeTable, const PDB::CodeView::TPI::Record* methodRecord, std::string& methodPrototype) -{ - PDB_ASSERT(methodRecord->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION, "TPI Record kind is 0x%X, expected 0x%X (LF_MFUNCTION)", - (uint32_t)methodRecord->header.kind, (uint32_t)PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION); - - std::string underlyingTypePrototype; - - size_t markerPos = 0; - uint8_t pointerLevel = 0; - const PDB::CodeView::TPI::Record* referencedType = nullptr; - const PDB::CodeView::TPI::Record* underlyingType = nullptr; - const PDB::CodeView::TPI::Record* modifierRecord = nullptr; - - methodPrototype.clear(); - - auto typeName = GetTypeName(typeTable, methodRecord->data.LF_MFUNCTION.rvtype, pointerLevel, &referencedType, &modifierRecord); - if (typeName) - { - if (modifierRecord) - { - methodPrototype += GetModifierName(modifierRecord); - methodPrototype += ' '; - } - - methodPrototype += typeName; - - for (size_t i = 0; i < pointerLevel; i++) - methodPrototype += '*'; - } - else - { - underlyingType = typeTable.GetTypeRecord(referencedType->data.LF_POINTER.utype); - if (!underlyingType) - return false; - - if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - if (!GetFunctionPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - } - else if(underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - if (!GetMethodPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - } - else - { - PDB_ASSERT(false, "Unhandled underlyingType kind 0x%X", (uint32_t)underlyingType->header.kind); - } - - markerPos = underlyingTypePrototype.find("%s"); - underlyingTypePrototype.erase(markerPos, 2); - methodPrototype = underlyingTypePrototype; - } - - methodPrototype += " %s("; - - if (methodRecord->data.LF_MFUNCTION.parmcount) - { - auto argList = typeTable.GetTypeRecord(methodRecord->data.LF_MFUNCTION.arglist); - if (!argList) - return false; - - for (size_t i = 0; i < argList->data.LF_ARGLIST.count; i++) - { - pointerLevel = 0; - typeName = GetTypeName(typeTable, argList->data.LF_ARGLIST.arg[i], pointerLevel, &referencedType, &modifierRecord); - if (referencedType) - { - if (referencedType->data.LF_POINTER.utype >= typeTable.GetFirstTypeIndex()) - { - underlyingType = typeTable.GetTypeRecord(referencedType->data.LF_POINTER.utype); - if (!underlyingType) - return false; - } - - if (!underlyingType || (underlyingType->header.kind != PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE && underlyingType->header.kind != PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION)) - { - if (modifierRecord) - { - methodPrototype += GetModifierName(modifierRecord); - methodPrototype += ' '; - } - - if(typeName) - methodPrototype += typeName; - - methodPrototype += '*'; - - if (referencedType->data.LF_POINTER.attr.isvolatile) - methodPrototype += "volatile"; - else if (referencedType->data.LF_POINTER.attr.isconst) - methodPrototype += "const"; - } - else if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - if (!GetFunctionPrototype(typeTable, underlyingType, underlyingTypePrototype)) - return false; - - markerPos = underlyingTypePrototype.find("%s"); - underlyingTypePrototype.erase(markerPos, 2); - - for (size_t j = 1; j < pointerLevel; j++) - underlyingTypePrototype.insert(markerPos, 1, '*'); - - methodPrototype += underlyingTypePrototype; - } - else if (underlyingType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - methodPrototype += GetTypeName(typeTable, argList->data.LF_ARGLIST.arg[i]); - } - } - else - { - methodPrototype += typeName; - } - - if (i < (argList->data.LF_ARGLIST.count - 1)) - methodPrototype += ", "; - } - } - - methodPrototype += ')'; - - return true; -} - - -static const char* GetMethodName(const PDB::CodeView::TPI::FieldList* fieldRecord) -{ - auto methodAttributes = static_cast(fieldRecord->data.LF_ONEMETHOD.attributes.mprop); - switch (methodAttributes) - { - case PDB::CodeView::TPI::MethodProperty::Intro: - case PDB::CodeView::TPI::MethodProperty::PureIntro: - return &reinterpret_cast(fieldRecord->data.LF_ONEMETHOD.vbaseoff)[sizeof(uint32_t)]; - default: - break; - } - - return &reinterpret_cast(fieldRecord->data.LF_ONEMETHOD.vbaseoff)[0]; -} - - -static void DisplayFields(const TypeTable& typeTable, const PDB::CodeView::TPI::Record* record) -{ - const PDB::CodeView::TPI::Record* referencedType = nullptr; - const PDB::CodeView::TPI::Record* underlyingType = nullptr; - const PDB::CodeView::TPI::Record* modifierRecord = nullptr; - const char* leafName = nullptr; - const char* typeName = nullptr; - std::string functionPrototype; - uint16_t offset = 0; - - auto maximumSize = record->header.size - sizeof(uint16_t); - - for (size_t i = 0; i < maximumSize;) - { - uint8_t pointerLevel = 0; - auto fieldRecord = reinterpret_cast(reinterpret_cast(&record->data.LF_FIELD.list) + i); - - // Other kinds of records are not implemented - PDB_ASSERT( - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_BCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VBCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_IVBCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_INDEX || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VFUNCTAB || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_NESTTYPE || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUM || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_MEMBER || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_STMEMBER || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_METHOD || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ONEMETHOD, - "Unknown record kind %X", - static_cast(fieldRecord->kind)); - - if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_MEMBER) - { - if (fieldRecord->data.LF_MEMBER.lfEasy.kind < PDB::CodeView::TPI::TypeRecordKind::LF_NUMERIC) - offset = *reinterpret_cast(&fieldRecord->data.LF_MEMBER.offset[0]); - else - offset = *reinterpret_cast(&fieldRecord->data.LF_MEMBER.offset[sizeof(PDB::CodeView::TPI::TypeRecordKind)]); - - leafName = GetLeafName(fieldRecord->data.LF_MEMBER.offset, fieldRecord->data.LF_MEMBER.lfEasy.kind); - - typeName = GetTypeName(typeTable, fieldRecord->data.LF_MEMBER.index, pointerLevel, &referencedType, &modifierRecord); - if (referencedType) - { - switch (referencedType->header.kind) - { - case PDB::CodeView::TPI::TypeRecordKind::LF_POINTER: - if (referencedType->data.LF_POINTER.utype >= typeTable.GetFirstTypeIndex()) - { - underlyingType = typeTable.GetTypeRecord(referencedType->data.LF_POINTER.utype); - if (!underlyingType) - break; - - if (underlyingType->header.kind != PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - if (modifierRecord) - printf("[0x%X]%s %s", offset, GetModifierName(modifierRecord), typeName); - else - printf("[0x%X]%s", offset, typeName); - - for (size_t j = 0; j < pointerLevel; j++) - printf("*"); - - printf(" %s\n", leafName); - } - else - { - if (!GetFunctionPrototype(typeTable, underlyingType, functionPrototype)) - break; - - printf("[0x%X]", offset); - printf(functionPrototype.c_str(), leafName); - printf("\n"); - } - } - else - { - printf("[0x%X]%s", offset, typeName); - - for (size_t j = 0; j < pointerLevel; j++) - printf("*"); - - if (referencedType->data.LF_POINTER.attr.isvolatile) - printf(" volatile"); - else if (referencedType->data.LF_POINTER.attr.isconst) - printf(" const"); - - printf(" %s\n", leafName); - } - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_BITFIELD: - if (typeName) - { - printf("[0x%X]%s %s : %d\n", - offset, - typeName, - leafName, - referencedType->data.LF_BITFIELD.length); - } - else - { - modifierRecord = typeTable.GetTypeRecord(referencedType->data.LF_BITFIELD.type); - if (!modifierRecord) - break; - - printf("[0x%X]%s %s %s : %d\n", - offset, - GetModifierName(modifierRecord), - GetTypeName(typeTable, modifierRecord->data.LF_MODIFIER.type, pointerLevel, nullptr, nullptr), - leafName, - referencedType->data.LF_BITFIELD.length); - } - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_ARRAY: - if (!modifierRecord) - { - printf("[0x%X]%s %s[] /*0x%X*/\n", - offset, - typeName, - leafName, - *reinterpret_cast(referencedType->data.LF_ARRAY.data)); - } - else - { - printf("[0x%X]%s %s %s[] /*0x%X*/\n", - offset, - GetModifierName(modifierRecord), - GetTypeName(typeTable, modifierRecord->data.LF_MODIFIER.type, pointerLevel, nullptr, nullptr), - leafName, - *reinterpret_cast(referencedType->data.LF_ARRAY.data)); - } - break; - default: - break; - } - } - else - { - if (modifierRecord) - printf("[0x%X]%s %s %s\n", offset, GetModifierName(modifierRecord), typeName, leafName); - else - printf("[0x%X]%s %s\n", offset, typeName, leafName); - } - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_NESTTYPE) - { - leafName = &fieldRecord->data.LF_NESTTYPE.name[0]; - typeName = GetTypeName(typeTable, fieldRecord->data.LF_NESTTYPE.index, pointerLevel, &referencedType, &modifierRecord); - - printf("%s %s\n", typeName, leafName); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_STMEMBER) - { - leafName = &fieldRecord->data.LF_STMEMBER.name[0]; - typeName = GetTypeName(typeTable, fieldRecord->data.LF_STMEMBER.index, pointerLevel, &referencedType, &modifierRecord); - - if (!modifierRecord) - printf("%s %s\n", typeName, leafName); - else - printf("%s %s %s\n", GetModifierName(modifierRecord), typeName, leafName); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_METHOD) - { - leafName = fieldRecord->data.LF_METHOD.name; - - auto methodList = typeTable.GetTypeRecord(fieldRecord->data.LF_METHOD.mList); - if (!methodList) - break; - - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/symtypeutils.h#L220 - size_t offsetInMethodList = 0; - for (size_t j = 0; j < fieldRecord->data.LF_METHOD.count; j++) - { - size_t entrySize = 2 * sizeof(uint32_t); - const PDB::CodeView::TPI::MethodListEntry* entry = (const PDB::CodeView::TPI::MethodListEntry*)(methodList->data.LF_METHODLIST.mList + offsetInMethodList); - if (!GetMethodPrototype(typeTable, typeTable.GetTypeRecord(entry->index), functionPrototype)) - break; - printf(functionPrototype.c_str(), leafName); - printf("\n"); - PDB::CodeView::TPI::MethodProperty methodProp = (PDB::CodeView::TPI::MethodProperty)entry->attributes.mprop; - if (methodProp == PDB::CodeView::TPI::MethodProperty::Intro || methodProp == PDB::CodeView::TPI::MethodProperty::PureIntro) - entrySize += sizeof(uint32_t); - offsetInMethodList += entrySize; - } - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ONEMETHOD) - { - leafName = GetMethodName(fieldRecord); - - referencedType = typeTable.GetTypeRecord(fieldRecord->data.LF_ONEMETHOD.index); - if (!referencedType) - break; - - if (!GetMethodPrototype(typeTable, referencedType, functionPrototype)) - break; - - printf(functionPrototype.c_str(), leafName); - printf("\n"); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_BCLASS) - { - leafName = GetLeafName(fieldRecord->data.LF_BCLASS.offset, fieldRecord->data.LF_BCLASS.lfEasy.kind); - - i += static_cast(leafName - reinterpret_cast(fieldRecord)); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VBCLASS || fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_IVBCLASS) - { - // virtual base pointer offset from address point - // followed by virtual base offset from vbtable - - const PDB::CodeView::TPI::TypeRecordKind vbpOffsetAddressPointKind = *(const PDB::CodeView::TPI::TypeRecordKind*)(fieldRecord->data.LF_IVBCLASS.vbpOffset); - const uint8_t vbpOffsetAddressPointSize = GetLeafSize(vbpOffsetAddressPointKind); - - const PDB::CodeView::TPI::TypeRecordKind vbpOffsetVBTableKind = *(const PDB::CodeView::TPI::TypeRecordKind*)(fieldRecord->data.LF_IVBCLASS.vbpOffset + vbpOffsetAddressPointSize); - const uint8_t vbpOffsetVBTableSize = GetLeafSize(vbpOffsetVBTableKind); - - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_VBCLASS); - i += vbpOffsetAddressPointSize + vbpOffsetVBTableSize; - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_INDEX) - { - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_INDEX); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VFUNCTAB) - { - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_VFUNCTAB); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else - { - break; - } - - i += static_cast(leafName - reinterpret_cast(fieldRecord)); - i += strnlen(leafName, maximumSize - i - 1) + 1; - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - } -} - -// Used in ExamplesFunctionVariables -std::string GetTypeName(const TypeTable& typeTable, uint32_t typeIndex) -{ - uint8_t pointerLevel = 0; - const PDB::CodeView::TPI::Record* referencedType = nullptr; - const PDB::CodeView::TPI::Record* modifierRecord = nullptr; - - const char* typeName = GetTypeName(typeTable, typeIndex, pointerLevel, &referencedType, &modifierRecord); - - if (typeName == nullptr) - { - if (referencedType == nullptr && (typeIndex & 0x80000000) != 0) - { - // d3d12.pdb\1DEAE23C86E6462A86018FB180EB8E4A1, S_CALLSITE for `dynamic initializer for 'g_Telemetry'': typeIndex == 0x80900001 - char typeIndexBuf[0x0C]; - sprintf_s(typeIndexBuf, sizeof(typeIndexBuf), "%08X", typeIndex); - return std::string(""; - } - PDB_ASSERT(referencedType != nullptr, "Neither typeName nor referencedType are set."); - - if (referencedType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_POINTER) - { - std::string pointerType = GetTypeName(typeTable, referencedType->data.LF_POINTER.utype); - - for (size_t i = 0; i < pointerLevel; i++) - pointerType += '*'; - - return pointerType; - } - else if (referencedType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_ARRAY) - { - const std::string elementType = GetTypeName(typeTable, referencedType->data.LF_ARRAY.elemtype); - const std::string indexType = GetTypeName(typeTable, referencedType->data.LF_ARRAY.idxtype); - - return elementType + "[" + indexType + "]"; - } - else if (referencedType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE) - { - std::string functionPrototype; - - if (!GetFunctionPrototype(typeTable, referencedType, functionPrototype)) - { - PDB_ASSERT(false, "Resolving function prototype failed"); - return "resolving function type failed"; - } - - return functionPrototype; - } - else if (referencedType->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - std::string methodPrototype; - - if (!GetMethodPrototype(typeTable, referencedType, methodPrototype)) - { - PDB_ASSERT(false, "Resolving method prototype failed"); - return "resolving method type failed"; - } - - std::string classTypeName = GetTypeName(typeTable, referencedType->data.LF_MFUNCTION.classtype); - classTypeName += "::*"; - - const int stringLength = std::snprintf(nullptr, 0, methodPrototype.c_str(), classTypeName.c_str()); - PDB_ASSERT(stringLength > 0, "String length %i <= 0", stringLength); - - std::vector resultString(static_cast(stringLength) + 1u); - - std::snprintf(&resultString[0], resultString.size(), methodPrototype.c_str(), classTypeName.c_str()); - - return std::string(resultString.data()); - } - else - { - PDB_ASSERT(false, "Unhandled referencedType kind 0x%X", static_cast(referencedType->header.kind)); - return "not found"; - } - } - - return typeName; -} - -static void DisplayEnumerates(const PDB::CodeView::TPI::Record* record, uint8_t underlyingTypeSize) -{ - const char* leafName = nullptr; - uint64_t value = 0; - const char* valuePtr = nullptr; - - auto maximumSize = record->header.size - sizeof(uint16_t); - - for (size_t i = 0; i < maximumSize;) - { - auto fieldRecord = reinterpret_cast(reinterpret_cast(&record->data.LF_FIELD.list) + i); - - leafName = GetLeafName(fieldRecord->data.LF_ENUMERATE.value, fieldRecord->data.LF_ENUMERATE.lfEasy.kind); - - if (fieldRecord->data.LF_ENUMERATE.lfEasy.kind < PDB::CodeView::TPI::TypeRecordKind::LF_NUMERIC) - valuePtr = &fieldRecord->data.LF_ENUMERATE.value[0]; - else - valuePtr = &fieldRecord->data.LF_ENUMERATE.value[sizeof(PDB::CodeView::TPI::TypeRecordKind)]; - - switch (underlyingTypeSize) - { - case 1: - value = *reinterpret_cast(&fieldRecord->data.LF_ENUMERATE.value[0]); - break; - case 2: - value = *reinterpret_cast(&fieldRecord->data.LF_ENUMERATE.value[0]); - break; - case 4: - value = *reinterpret_cast(&fieldRecord->data.LF_ENUMERATE.value[0]); - break; - case 8: - value = *reinterpret_cast(&fieldRecord->data.LF_ENUMERATE.value[0]); - break; - default: - break; - } - - printf("%s = %" PRIu64 "\n", leafName, value); - - i += static_cast(leafName - reinterpret_cast(fieldRecord)); - i += strnlen(leafName, maximumSize - i - 1) + 1; - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - - (void)valuePtr; - } -} - - -void ExampleTypes(const PDB::TPIStream& tpiStream); -void ExampleTypes(const PDB::TPIStream& tpiStream) -{ - TimedScope total("\nRunning example \"Function types\""); - - TimedScope typeTableScope("Create TypeTable"); - TypeTable typeTable(tpiStream); - typeTableScope.Done(); - - for (const auto& record : typeTable.GetTypeRecords()) - { - if ((record->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_CLASS) || (record->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE)) - { - if (record->data.LF_CLASS.property.fwdref) - continue; - - auto typeRecord = typeTable.GetTypeRecord(record->data.LF_CLASS.field); - if (!typeRecord) - continue; - - auto leafName = GetLeafName(record->data.LF_CLASS.data, record->data.LF_CLASS.lfEasy.kind); - - printf("struct %s\n{\n", leafName); - - DisplayFields(typeTable, typeRecord); - - printf("}\n"); - } - else if (record->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_UNION) - { - if (record->data.LF_UNION.property.fwdref) - continue; - - auto typeRecord = typeTable.GetTypeRecord(record->data.LF_UNION.field); - if (!typeRecord) - continue; - - auto leafName = GetLeafName(record->data.LF_UNION.data, static_cast(0)); - - printf("union %s\n{\n", leafName); - - DisplayFields(typeTable, typeRecord); - - printf("}\n"); - } - else if (record->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUM) - { - if (record->data.LF_ENUM.property.fwdref) - continue; - - auto typeRecord = typeTable.GetTypeRecord(record->data.LF_ENUM.field); - if (!typeRecord) - continue; - - printf("enum %s\n{\n", record->data.LF_ENUM.name); - - DisplayEnumerates(typeRecord, GetLeafSize(static_cast(record->data.LF_ENUM.utype))); - - printf("}\n"); - } - } - - total.Done(tpiStream.GetTypeRecordCount()); -} - -template -static void TagRecursively(const TypeTable& typeTable, uint32_t typeIndex, T setName); - -#define TAG_AND_CHECK(typeIndex) if (setName(typeIndex)) TagRecursively(typeTable, typeIndex, setName) - -template -static void TagChildren(const TypeTable& typeTable, const PDB::CodeView::TPI::Record* record, T setName) -{ - const char* leafName = nullptr; - - auto maximumSize = record->header.size - sizeof(uint16_t); - - for (size_t i = 0; i < maximumSize;) - { - auto fieldRecord = reinterpret_cast(reinterpret_cast(&record->data.LF_FIELD.list) + i); - - // these are all the record kinds I have observed - PDB_ASSERT( - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_BCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VBCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_IVBCLASS || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_INDEX || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VFUNCTAB || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_NESTTYPE || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUM || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_MEMBER || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_STMEMBER || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_METHOD || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ONEMETHOD || - fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUMERATE, - "Unknown record kind %X", - static_cast(fieldRecord->kind)); - - if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_MEMBER) - { - leafName = GetLeafName(fieldRecord->data.LF_MEMBER.offset, fieldRecord->data.LF_MEMBER.lfEasy.kind); - TAG_AND_CHECK(fieldRecord->data.LF_MEMBER.index); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_NESTTYPE) - { - leafName = &fieldRecord->data.LF_NESTTYPE.name[0]; - TAG_AND_CHECK(fieldRecord->data.LF_NESTTYPE.index); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_STMEMBER) - { - leafName = &fieldRecord->data.LF_STMEMBER.name[0]; - TAG_AND_CHECK(fieldRecord->data.LF_STMEMBER.index); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_METHOD) - { - leafName = fieldRecord->data.LF_METHOD.name; - setName(fieldRecord->data.LF_METHOD.mList); - - auto methodList = typeTable.GetTypeRecord(fieldRecord->data.LF_METHOD.mList); - if (!methodList) - break; - - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/symtypeutils.h#L220 - size_t offsetInMethodList = 0; - for (size_t j = 0; j < fieldRecord->data.LF_METHOD.count; j++) - { - size_t entrySize = sizeof(PDB::CodeView::TPI::MethodListEntry); - const PDB::CodeView::TPI::MethodListEntry* entry = (const PDB::CodeView::TPI::MethodListEntry*)(methodList->data.LF_METHODLIST.mList + offsetInMethodList); - TAG_AND_CHECK(entry->index); - PDB::CodeView::TPI::MethodProperty methodProp = (PDB::CodeView::TPI::MethodProperty)entry->attributes.mprop; - if (methodProp == PDB::CodeView::TPI::MethodProperty::Intro || methodProp == PDB::CodeView::TPI::MethodProperty::PureIntro) - entrySize += sizeof(uint32_t); - offsetInMethodList += entrySize; - } - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ONEMETHOD) - { - leafName = GetMethodName(fieldRecord); - TAG_AND_CHECK(fieldRecord->data.LF_ONEMETHOD.index); - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_BCLASS) - { - leafName = GetLeafName(fieldRecord->data.LF_BCLASS.offset, fieldRecord->data.LF_BCLASS.lfEasy.kind); - - i += static_cast(leafName - reinterpret_cast(fieldRecord)); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VBCLASS || fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_IVBCLASS) - { - // virtual base pointer offset from address point - // followed by virtual base offset from vbtable - - const PDB::CodeView::TPI::TypeRecordKind vbpOffsetAddressPointKind = *(const PDB::CodeView::TPI::TypeRecordKind*)(fieldRecord->data.LF_IVBCLASS.vbpOffset); - const uint8_t vbpOffsetAddressPointSize = GetLeafSize(vbpOffsetAddressPointKind); - - const PDB::CodeView::TPI::TypeRecordKind vbpOffsetVBTableKind = *(const PDB::CodeView::TPI::TypeRecordKind*)(fieldRecord->data.LF_IVBCLASS.vbpOffset + vbpOffsetAddressPointSize); - const uint8_t vbpOffsetVBTableSize = GetLeafSize(vbpOffsetVBTableKind); - - TAG_AND_CHECK(fieldRecord->data.LF_VBCLASS.vbpIndex); - - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_VBCLASS); - i += vbpOffsetAddressPointSize + vbpOffsetVBTableSize; - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_INDEX) - { - // this is continued elsewhere - setName(fieldRecord->data.LF_INDEX.type); - auto continued = typeTable.GetTypeRecord(fieldRecord->data.LF_INDEX.type); - if (continued) - TagChildren(typeTable, continued, setName); - - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_INDEX); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_VFUNCTAB) - { - TAG_AND_CHECK(fieldRecord->data.LF_VFUNCTAB.type); - i += sizeof(PDB::CodeView::TPI::FieldList::Data::LF_VFUNCTAB); - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - continue; - } - else if (fieldRecord->kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUMERATE) - { - leafName = GetLeafName(fieldRecord->data.LF_ENUMERATE.value, fieldRecord->data.LF_ENUMERATE.lfEasy.kind); - } - else - { - break; - } - - i += static_cast(leafName - reinterpret_cast(fieldRecord)); - i += strnlen(leafName, maximumSize - i - 1) + 1; - i = (i + (sizeof(uint32_t) - 1)) & (0 - sizeof(uint32_t)); - } -} - -template -static void TagRecursively(const TypeTable& typeTable, uint32_t typeIndex, T setName) -{ - const PDB::CodeView::TPI::Record* record = typeTable.GetTypeRecord(typeIndex); - if (!record) - return; - switch (record->header.kind) - { - case PDB::CodeView::TPI::TypeRecordKind::LF_ARRAY: - TAG_AND_CHECK(record->data.LF_ARRAY.elemtype); - TAG_AND_CHECK(record->data.LF_ARRAY.idxtype); - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_POINTER: - TAG_AND_CHECK(record->data.LF_POINTER.utype); - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_MODIFIER: - TAG_AND_CHECK(record->data.LF_MODIFIER.type); - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE: - TAG_AND_CHECK(record->data.LF_PROCEDURE.rvtype); - TAG_AND_CHECK(record->data.LF_PROCEDURE.arglist); - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_ARGLIST: - { - size_t count = record->data.LF_ARGLIST.count; - for (size_t i = 0; i < count; i++) - { - uint32_t type = record->data.LF_ARGLIST.arg[i]; - TAG_AND_CHECK(type); - } - break; - } - case PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION: - TAG_AND_CHECK(record->data.LF_MFUNCTION.rvtype); - TAG_AND_CHECK(record->data.LF_MFUNCTION.arglist); - TAG_AND_CHECK(record->data.LF_MFUNCTION.thistype); - break; - case PDB::CodeView::TPI::TypeRecordKind::LF_FIELDLIST: - TagChildren(typeTable, record, setName); - break; - default: - break; - } -} - -// This example takes a PDB's TPI stream and prints out a CSV file that contains all records in the TPI stream. -// You can use it to figure out what's taking up space in the stream. -// -// The format of the CSV is Size; Kind; Name. "Size" is the size of the record in bytes, "Kind" is the kind of -// the entry, and "Name" is a name associated with this entry.Type - definitions, member functions, and member -// lists use their type as the name. The idea is that you can bucket by "Name" to get actionable information -//and insight. -// -// The Name is set to "???" if no name was found, and it is set to "!!!" if multiple names reference the entry. -void ExampleTPISize(const PDB::TPIStream& tpiStream, const char* outPath); -void ExampleTPISize(const PDB::TPIStream& tpiStream, const char* outPath) -{ - TimedScope total("\nRunning example \"TPI Size\""); - - FILE* f; -#ifndef __unix - fopen_s(&f, outPath, "w"); -#else - f = fopen(outPath, "w"); -#endif - PDB_ASSERT(f, "Failed to open %s for writing", outPath); - - fprintf(f, "Size;Kind;Name\n"); - - TimedScope typeTableScope("Create TypeTable"); - TypeTable typeTable(tpiStream); - typeTableScope.Done(); - - std::vector names; - names.resize(typeTable.GetTypeRecords().GetLength()); - - const size_t minIndex = typeTable.GetFirstTypeIndex(); - // sets the name of an entry and returns whether the name changed (because it wasn't set, or because we've found - // conflicting information). - auto setNameGlobal = [&names, minIndex](uint32_t typeIndex, const char* name) -> bool { - if (!name || typeIndex < minIndex) - return false; - size_t idx = typeIndex - minIndex; - const char* prev = names[idx]; - if (names[idx] == nullptr) - { - names[idx] = name; - return true; - } - else - { - names[idx] = "!!!"; // multiple references - return names[idx] != prev; - } - }; - - // collect base types and propagate their name - auto typeRecords = typeTable.GetTypeRecords(); - for (size_t i = 0, n = typeRecords.GetLength(); i < n; i++) - { - const PDB::CodeView::TPI::Record* record = typeRecords[i]; - PDB::CodeView::TPI::TypeRecordKind kind = record->header.kind; - if (kind == PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE) - { - names[i] = GetLeafName(record->data.LF_CLASS.data, record->data.LF_CLASS.lfEasy.kind); - auto setName = [&setNameGlobal, names, i](uint32_t typeIndex) -> bool { - return setNameGlobal(typeIndex, names[i]); - }; - TAG_AND_CHECK(record->data.LF_CLASS.field); - } - else if (kind == PDB::CodeView::TPI::TypeRecordKind::LF_CLASS) - { - names[i] = GetLeafName(record->data.LF_CLASS.data, record->data.LF_CLASS.lfEasy.kind); - auto setName = [&setNameGlobal, names, i](uint32_t typeIndex) -> bool { - return setNameGlobal(typeIndex, names[i]); - }; - TAG_AND_CHECK(record->data.LF_CLASS.field); - } - else if (kind == PDB::CodeView::TPI::TypeRecordKind::LF_UNION) - { - names[i] = GetLeafName(record->data.LF_UNION.data, static_cast(0)); - auto setName = [&setNameGlobal, names, i](uint32_t typeIndex) -> bool { - return setNameGlobal(typeIndex, names[i]); - }; - TAG_AND_CHECK(record->data.LF_UNION.field); - } - else if (kind == PDB::CodeView::TPI::TypeRecordKind::LF_ENUM) - { - names[i] = record->data.LF_ENUM.name; - auto setName = [&setNameGlobal, names, i](uint32_t typeIndex) -> bool { - return setNameGlobal(typeIndex, names[i]); - }; - TAG_AND_CHECK(record->data.LF_ENUM.field); - } - else if (kind == PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION) - { - const char* name = names[i]; - if (!name) - { - const PDB::CodeView::TPI::Record* containingRecord = typeTable.GetTypeRecord((record->data.LF_MFUNCTION.classtype)); - if (containingRecord) { - if (containingRecord->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_CLASS || - containingRecord->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE) - name = GetLeafName(containingRecord->data.LF_CLASS.data, containingRecord->data.LF_CLASS.lfEasy.kind); - else if (containingRecord->header.kind == PDB::CodeView::TPI::TypeRecordKind::LF_UNION) - name = GetLeafName(record->data.LF_UNION.data, static_cast(0)); - else - PDB_ASSERT(false, "unsupported"); - } - } - auto setName = [&setNameGlobal, name](uint32_t typeIndex) -> bool { - return setNameGlobal(typeIndex, name); - }; - uint32_t typeIndex = (uint32_t)(minIndex + i); - TAG_AND_CHECK(typeIndex); - } - } - - for (size_t i = 0, n = typeRecords.GetLength(); i < n; i++) - { - const PDB::CodeView::TPI::Record* record = typeRecords[i]; - const char* kindName = nullptr; - const char* typeName = i < names.size() ? names[i] : nullptr; - switch (record->header.kind) - { - case PDB::CodeView::TPI::TypeRecordKind::LF_VTSHAPE: kindName = "LF_VTSHAPE;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_POINTER: kindName = "LF_POINTER;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_MODIFIER: kindName = "LF_MODIFIER;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_PROCEDURE: kindName = "LF_PROCEDURE;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_FIELDLIST: kindName = "LF_FIELDLIST;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_LABEL: kindName = "LF_LABEL;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_ARGLIST: kindName = "LF_ARGLIST;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_BITFIELD: kindName = "LF_BITFIELD;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_METHODLIST: kindName = "LF_METHODLIST;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_ARRAY: kindName = "LF_ARRAY;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_PRECOMP: kindName = "LF_PRECOMP;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_MFUNCTION: kindName = "LF_MFUNCTION;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_STRUCTURE: kindName = "LF_STRUCTURE;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_CLASS: kindName = "LF_CLASS;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_UNION: kindName = "LF_UNION;"; break; - case PDB::CodeView::TPI::TypeRecordKind::LF_ENUM: kindName = "LF_ENUM;"; break; - default: break; - } - - fprintf(f, "%hu;", 2 + record->header.size); - if (kindName) - fprintf(f, "%s;", kindName); - else - fprintf(f, "0x%04X;", static_cast(record->header.kind)); - - if (typeName) - fprintf(f, "%s\n", typeName); - else - fprintf(f, "???\n"); - } - - fclose(f); - total.Done(tpiStream.GetTypeRecordCount()); -} -#undef TAG_AND_CHECK diff --git a/third_party/raw_pdb/src/Examples/Examples_PCH.cpp b/third_party/raw_pdb/src/Examples/Examples_PCH.cpp deleted file mode 100644 index 993ae7d..0000000 --- a/third_party/raw_pdb/src/Examples/Examples_PCH.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "Examples_PCH.h" diff --git a/third_party/raw_pdb/src/Examples/Examples_PCH.h b/third_party/raw_pdb/src/Examples/Examples_PCH.h deleted file mode 100644 index 0a7f2e2..0000000 --- a/third_party/raw_pdb/src/Examples/Examples_PCH.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Warnings.h" - -// The following clang warnings must be disabled for the examples to build with 0 warnings -#if PDB_COMPILER_CLANG -# pragma clang diagnostic ignored "-Wformat-nonliteral" // format string is not a string literal -# pragma clang diagnostic ignored "-Wswitch-default" // switch' missing 'default' label -# pragma clang diagnostic ignored "-Wcast-align" // increases required alignment from X to Y -# pragma clang diagnostic ignored "-Wold-style-cast" // use of old-style cast -#endif - -#if PDB_COMPILER_MSVC -# pragma warning(push, 0) -#elif PDB_COMPILER_CLANG -# pragma clang diagnostic push -#endif - -#if PDB_COMPILER_MSVC - // we compile without exceptions -# define _ALLOW_RTCc_IN_STL - - // triggered by Windows.h -# pragma warning (disable : 4668) - - // triggered by xlocale in VS 2017 -# pragma warning (disable : 4625) // copy constructor was implicitly defined as deleted -# pragma warning (disable : 4626) // assignment operator was implicitly defined as deleted -# pragma warning (disable : 5026) // move constructor was implicitly defined as deleted -# pragma warning (disable : 5027) // move assignment operator was implicitly defined as deleted -# pragma warning (disable : 4774) // format string expected in argument 1 is not a string literal -#endif - -#ifdef _WIN32 -# define NOMINMAX -# include -# undef cdecl -#endif -# include -# include -# include -# include -# include -# include - -#if PDB_COMPILER_MSVC -# pragma warning(pop) -#elif PDB_COMPILER_CLANG -# pragma clang diagnostic pop -#endif diff --git a/third_party/raw_pdb/src/Foundation/PDB_ArrayView.h b/third_party/raw_pdb/src/Foundation/PDB_ArrayView.h deleted file mode 100644 index 3c462ee..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_ArrayView.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Macros.h" -#include "PDB_Assert.h" - - -namespace PDB -{ - // A read-only view into arrays of any type and length. - template - class PDB_NO_DISCARD ArrayView - { - public: - // Constructs an array view from a C array with explicit length. - inline constexpr explicit ArrayView(const T* const array, size_t length) PDB_NO_EXCEPT - : m_data(array) - , m_length(length) - { - } - - PDB_DEFAULT_COPY_CONSTRUCTOR(ArrayView); - PDB_DEFAULT_MOVE_CONSTRUCTOR(ArrayView); - - // Provides read-only access to the underlying array. - PDB_NO_DISCARD inline constexpr const T* Decay(void) const PDB_NO_EXCEPT - { - return m_data; - } - - // Returns the length of the view. - PDB_NO_DISCARD inline constexpr size_t GetLength(void) const PDB_NO_EXCEPT - { - return m_length; - } - - // Returns the i-th element. - PDB_NO_DISCARD inline const T& operator[](size_t i) const PDB_NO_EXCEPT - { - PDB_ASSERT(i < GetLength(), "Index %zu out of bounds [0, %zu).", i, GetLength()); - return m_data[i]; - } - - - // ------------------------------------------------------------------------------------------------ - // Range-based for-loop support - // ------------------------------------------------------------------------------------------------ - - PDB_NO_DISCARD inline const T* begin(void) const PDB_NO_EXCEPT - { - return m_data; - } - - PDB_NO_DISCARD inline const T* end(void) const PDB_NO_EXCEPT - { - return m_data + m_length; - } - - private: - const T* const m_data; - const size_t m_length; - - PDB_DISABLE_MOVE_ASSIGNMENT(ArrayView); - PDB_DISABLE_COPY_ASSIGNMENT(ArrayView); - }; -} diff --git a/third_party/raw_pdb/src/Foundation/PDB_Assert.h b/third_party/raw_pdb/src/Foundation/PDB_Assert.h deleted file mode 100644 index cef2116..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Assert.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Macros.h" -#include "PDB_Log.h" - - -PDB_PUSH_WARNING_CLANG -PDB_DISABLE_WARNING_CLANG("-Wgnu-zero-variadic-macro-arguments") -PDB_DISABLE_WARNING_CLANG("-Wreserved-identifier") - -#if PDB_COMPILER_MSVC -extern "C" void __cdecl __debugbreak(void); -# pragma intrinsic(__debugbreak) -#elif defined(__has_builtin) && __has_builtin(__builtin_debugtrap) -# define __debugbreak() __builtin_debugtrap() -#else -# include -# define __debugbreak() raise(SIGTRAP) -#endif - - -#ifdef _DEBUG -# define PDB_ASSERT(_condition, _msg, ...) (_condition) ? (void)true : (PDB_LOG_ERROR(_msg, ##__VA_ARGS__), __debugbreak()) -#else -# define PDB_ASSERT(_condition, _msg, ...) PDB_NOOP(_condition, _msg, ##__VA_ARGS__) -#endif - -PDB_POP_WARNING_CLANG diff --git a/third_party/raw_pdb/src/Foundation/PDB_BitOperators.h b/third_party/raw_pdb/src/Foundation/PDB_BitOperators.h deleted file mode 100644 index 04f17a4..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_BitOperators.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Macros.h" - - -#define PDB_DEFINE_BIT_OPERATORS(_type) \ - PDB_NO_DISCARD inline constexpr _type operator|(_type lhs, _type rhs) PDB_NO_EXCEPT \ - { \ - return static_cast<_type>(PDB_AS_UNDERLYING(lhs) | PDB_AS_UNDERLYING(rhs)); \ - } \ - \ - PDB_NO_DISCARD inline constexpr _type operator&(_type lhs, _type rhs) PDB_NO_EXCEPT \ - { \ - return static_cast<_type>(PDB_AS_UNDERLYING(lhs) & PDB_AS_UNDERLYING(rhs)); \ - } \ - \ - PDB_NO_DISCARD inline constexpr _type operator~(_type value) PDB_NO_EXCEPT \ - { \ - return static_cast<_type>(~PDB_AS_UNDERLYING(value)); \ - } diff --git a/third_party/raw_pdb/src/Foundation/PDB_BitUtil.h b/third_party/raw_pdb/src/Foundation/PDB_BitUtil.h deleted file mode 100644 index 7dc5ee3..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_BitUtil.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Assert.h" - -#ifdef _WIN32 - PDB_PUSH_WARNING_CLANG - PDB_DISABLE_WARNING_CLANG("-Wreserved-identifier") - - extern "C" unsigned char _BitScanForward(unsigned long* _Index, unsigned long _Mask); - - PDB_POP_WARNING_CLANG - -# if PDB_COMPILER_MSVC -# pragma intrinsic(_BitScanForward) -# endif -#endif - - -namespace PDB -{ - namespace BitUtil - { - // Returns whether the given unsigned value is a power of two. - template - PDB_NO_DISCARD inline constexpr bool IsPowerOfTwo(T value) PDB_NO_EXCEPT - { - PDB_ASSERT(value != 0u, "Invalid value."); - - return (value & (value - 1u)) == 0u; - } - - - // Rounds the given unsigned value up to the next multiple. - template - PDB_NO_DISCARD inline constexpr T RoundUpToMultiple(T numToRound, T multipleOf) PDB_NO_EXCEPT - { - PDB_ASSERT(IsPowerOfTwo(multipleOf), "Multiple must be a power-of-two."); - - return (numToRound + (multipleOf - 1u)) & ~(multipleOf - 1u); - } - - - // Finds the position of the first set bit in the given value starting from the LSB, e.g. FindFirstSetBit(0b00000010) == 1. - // This operation is also known as CTZ (Count Trailing Zeros). - template - PDB_NO_DISCARD inline uint32_t FindFirstSetBit(T value) PDB_NO_EXCEPT; - - template <> - PDB_NO_DISCARD inline uint32_t FindFirstSetBit(uint32_t value) PDB_NO_EXCEPT - { - PDB_ASSERT(value != 0u, "Invalid value."); - -#ifdef _WIN32 - unsigned long result = 0ul; - - _BitScanForward(&result, value); -#else - unsigned int result = 0u; - - result = static_cast(__builtin_ffs(static_cast(value))); - if (result) - { - --result; - } -#endif - - return result; - } - } -} diff --git a/third_party/raw_pdb/src/Foundation/PDB_CRT.h b/third_party/raw_pdb/src/Foundation/PDB_CRT.h deleted file mode 100644 index a7df4aa..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_CRT.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -// Original raw_pdb forward-declares CRT functions to avoid pulling in headers, -// but this conflicts with MinGW's headers when compiled alongside Qt. -// Include the real headers instead. -#include -#include diff --git a/third_party/raw_pdb/src/Foundation/PDB_Forward.h b/third_party/raw_pdb/src/Foundation/PDB_Forward.h deleted file mode 100644 index ba82dfe..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Forward.h +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - - -// See Jonathan Mueller's blog for replacing std::move and std::forward: -// https://foonathan.net/2021/09/move-forward/ -#define PDB_FORWARD(...) static_cast(__VA_ARGS__) diff --git a/third_party/raw_pdb/src/Foundation/PDB_Log.h b/third_party/raw_pdb/src/Foundation/PDB_Log.h deleted file mode 100644 index 83a8518..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Log.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Macros.h" -#include "PDB_CRT.h" - - -PDB_PUSH_WARNING_CLANG -PDB_DISABLE_WARNING_CLANG("-Wgnu-zero-variadic-macro-arguments") - -#define PDB_LOG_ERROR(_format, ...) printf(_format, ##__VA_ARGS__) - -PDB_POP_WARNING_CLANG diff --git a/third_party/raw_pdb/src/Foundation/PDB_Macros.h b/third_party/raw_pdb/src/Foundation/PDB_Macros.h deleted file mode 100644 index fddcccf..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Macros.h +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Platform.h" -#include "PDB_TypeTraits.h" - - -// ------------------------------------------------------------------------------------------------ -// ATTRIBUTES -// ------------------------------------------------------------------------------------------------ - -// Indicates to the compiler that the return value of a function or class should not be ignored. -#if PDB_CPP_17 -# define PDB_NO_DISCARD [[nodiscard]] -#else -# define PDB_NO_DISCARD -#endif - -// Indicates to the compiler that a function does not throw an exception. -#define PDB_NO_EXCEPT noexcept - - -// ------------------------------------------------------------------------------------------------ -// SPECIAL MEMBER FUNCTIONS -// ------------------------------------------------------------------------------------------------ - -// Default special member functions. -#define PDB_DEFAULT_COPY_CONSTRUCTOR(_name) _name(const _name&) PDB_NO_EXCEPT = default -#define PDB_DEFAULT_COPY_ASSIGNMENT(_name) _name& operator=(const _name&) PDB_NO_EXCEPT = default -#define PDB_DEFAULT_MOVE_CONSTRUCTOR(_name) _name(_name&&) PDB_NO_EXCEPT = default -#define PDB_DEFAULT_MOVE_ASSIGNMENT(_name) _name& operator=(_name&&) PDB_NO_EXCEPT = default - -// Default copy member functions. -#define PDB_DEFAULT_COPY(_name) PDB_DEFAULT_COPY_CONSTRUCTOR(_name); PDB_DEFAULT_COPY_ASSIGNMENT(_name) - -// Default move member functions. -#define PDB_DEFAULT_MOVE(_name) PDB_DEFAULT_MOVE_CONSTRUCTOR(_name); PDB_DEFAULT_MOVE_ASSIGNMENT(_name) - -// Single macro to default all copy and move member functions. -#define PDB_DEFAULT_COPY_MOVE(_name) PDB_DEFAULT_COPY(_name); PDB_DEFAULT_MOVE(_name) - -// Disable special member functions. -#define PDB_DISABLE_COPY_CONSTRUCTOR(_name) _name(const _name&) PDB_NO_EXCEPT = delete -#define PDB_DISABLE_COPY_ASSIGNMENT(_name) _name& operator=(const _name&) PDB_NO_EXCEPT = delete -#define PDB_DISABLE_MOVE_CONSTRUCTOR(_name) _name(_name&&) PDB_NO_EXCEPT = delete -#define PDB_DISABLE_MOVE_ASSIGNMENT(_name) _name& operator=(_name&&) PDB_NO_EXCEPT = delete - -// Disable copy member functions. -#define PDB_DISABLE_COPY(_name) PDB_DISABLE_COPY_CONSTRUCTOR(_name); PDB_DISABLE_COPY_ASSIGNMENT(_name) - -// Disable move member functions. -#define PDB_DISABLE_MOVE(_name) PDB_DISABLE_MOVE_CONSTRUCTOR(_name); PDB_DISABLE_MOVE_ASSIGNMENT(_name) - -// Single macro to disable all copy and move member functions. -#define PDB_DISABLE_COPY_MOVE(_name) PDB_DISABLE_COPY(_name); PDB_DISABLE_MOVE(_name) - - -// ------------------------------------------------------------------------------------------------ -// COMPILER WARNINGS -// ------------------------------------------------------------------------------------------------ - -#if PDB_COMPILER_MSVC -# define PDB_PRAGMA(_x) __pragma(_x) - -# define PDB_PUSH_WARNING_MSVC PDB_PRAGMA(warning(push)) -# define PDB_SUPPRESS_WARNING_MSVC(_number) PDB_PRAGMA(warning(suppress : _number)) -# define PDB_DISABLE_WARNING_MSVC(_number) PDB_PRAGMA(warning(disable : _number)) -# define PDB_POP_WARNING_MSVC PDB_PRAGMA(warning(pop)) - -# define PDB_PUSH_WARNING_CLANG -# define PDB_DISABLE_WARNING_CLANG(_diagnostic) -# define PDB_POP_WARNING_CLANG -#elif PDB_COMPILER_CLANG -# define PDB_PRAGMA(_x) _Pragma(#_x) - -# define PDB_PUSH_WARNING_MSVC -# define PDB_SUPPRESS_WARNING_MSVC(_number) -# define PDB_DISABLE_WARNING_MSVC(_number) -# define PDB_POP_WARNING_MSVC - -# define PDB_PUSH_WARNING_CLANG PDB_PRAGMA(clang diagnostic push) -# define PDB_DISABLE_WARNING_CLANG(_diagnostic) PDB_PRAGMA(clang diagnostic ignored _diagnostic) -# define PDB_POP_WARNING_CLANG PDB_PRAGMA(clang diagnostic pop) -#elif PDB_COMPILER_GCC -# define PDB_PRAGMA(_x) _Pragma(#_x) - -# define PDB_PUSH_WARNING_MSVC -# define PDB_SUPPRESS_WARNING_MSVC(_number) -# define PDB_DISABLE_WARNING_MSVC(_number) -# define PDB_POP_WARNING_MSVC - -# define PDB_PUSH_WARNING_CLANG -# define PDB_DISABLE_WARNING_CLANG(_diagnostic) -# define PDB_POP_WARNING_CLANG -#endif - - -// ------------------------------------------------------------------------------------------------ -// MISCELLANEOUS -// ------------------------------------------------------------------------------------------------ - -// Trick to make other macros require a semicolon at the end. -#define PDB_REQUIRE_SEMICOLON static_assert(true, "") - -// Defines a C-like flexible array member. -#define PDB_FLEXIBLE_ARRAY_MEMBER(_type, _name) \ - PDB_PUSH_WARNING_MSVC \ - PDB_PUSH_WARNING_CLANG \ - PDB_DISABLE_WARNING_MSVC(4200) \ - PDB_DISABLE_WARNING_CLANG("-Wzero-length-array") \ - _type _name[0]; \ - PDB_POP_WARNING_MSVC \ - PDB_POP_WARNING_CLANG \ - PDB_REQUIRE_SEMICOLON - -// Casts any value to the value of the underlying type. -#define PDB_AS_UNDERLYING(_value) static_cast::type>(_value) - -// Signals to the compiler that a function should be ignored, but have its argument list parsed (and "used", so as to not generate "unused variable" warnings). -#if PDB_COMPILER_MSVC -# define PDB_NOOP __noop -#else -# define PDB_NOOP(...) (void)sizeof(__VA_ARGS__) -#endif diff --git a/third_party/raw_pdb/src/Foundation/PDB_Memory.h b/third_party/raw_pdb/src/Foundation/PDB_Memory.h deleted file mode 100644 index ccb7e86..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Memory.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - - -#define PDB_NEW(_type) new _type -#define PDB_NEW_ARRAY(_type, _length) new _type[_length] - -#define PDB_DELETE(_ptr) delete _ptr -#define PDB_DELETE_ARRAY(_ptr) delete[] _ptr diff --git a/third_party/raw_pdb/src/Foundation/PDB_Move.h b/third_party/raw_pdb/src/Foundation/PDB_Move.h deleted file mode 100644 index 04bf78b..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Move.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_TypeTraits.h" - - -// See Jonathan Mueller's blog for replacing std::move and std::forward: -// https://foonathan.net/2020/09/move-forward/ -#define PDB_MOVE(...) static_cast::type&&>(__VA_ARGS__) diff --git a/third_party/raw_pdb/src/Foundation/PDB_Platform.h b/third_party/raw_pdb/src/Foundation/PDB_Platform.h deleted file mode 100644 index 8775a54..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Platform.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - - -// determine the compiler/toolchain used -#if defined(__clang__) -# define PDB_COMPILER_MSVC 0 -# define PDB_COMPILER_CLANG 1 -# define PDB_COMPILER_GCC 0 -#elif defined(_MSC_VER) -# define PDB_COMPILER_MSVC 1 -# define PDB_COMPILER_CLANG 0 -# define PDB_COMPILER_GCC 0 -#elif defined(__GNUC__) -# define PDB_COMPILER_MSVC 0 -# define PDB_COMPILER_CLANG 0 -# define PDB_COMPILER_GCC 1 -#else -# error("Unknown compiler."); -#endif - -// check whether C++17 is available -#if __cplusplus >= 201703L -# define PDB_CPP_17 1 -#else -# define PDB_CPP_17 0 -#endif - -// define used standard types -typedef decltype(sizeof(0)) size_t; -static_assert(sizeof(sizeof(0)) == sizeof(size_t), "Wrong size."); - -typedef int int32_t; -static_assert(sizeof(int32_t) == 4u, "Wrong size."); - -typedef unsigned char uint8_t; -static_assert(sizeof(uint8_t) == 1u, "Wrong size."); - -typedef unsigned short uint16_t; -static_assert(sizeof(uint16_t) == 2u, "Wrong size."); - -typedef unsigned int uint32_t; -static_assert(sizeof(uint32_t) == 4u, "Wrong size."); diff --git a/third_party/raw_pdb/src/Foundation/PDB_PointerUtil.h b/third_party/raw_pdb/src/Foundation/PDB_PointerUtil.h deleted file mode 100644 index 014297d..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_PointerUtil.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Macros.h" -#include "PDB_TypeTraits.h" - - -namespace PDB -{ - namespace Pointer - { - // Offsets any pointer by a given number of bytes. - template - PDB_NO_DISCARD inline T Offset(U* anyPointer, V howManyBytes) PDB_NO_EXCEPT - { - static_assert(PDB::is_pointer::value == true, "Type T must be a pointer type."); - - union - { - T as_T; - U* as_U_ptr; - char* as_char_ptr; - }; - - as_U_ptr = anyPointer; - as_char_ptr += howManyBytes; - - return as_T; - } - } -} diff --git a/third_party/raw_pdb/src/Foundation/PDB_TypeTraits.h b/third_party/raw_pdb/src/Foundation/PDB_TypeTraits.h deleted file mode 100644 index 9286453..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_TypeTraits.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - - -// provide our own type traits to avoid pulling in unnecessary includes -namespace PDB -{ - template - struct is_pointer - { - static constexpr bool value = false; - }; - - template - struct is_pointer - { - static constexpr bool value = true; - }; - - template - struct is_pointer - { - static constexpr bool value = true; - }; - - template - struct is_pointer - { - static constexpr bool value = true; - }; - - template - struct is_pointer - { - static constexpr bool value = true; - }; - - - template - struct remove_reference - { - using type = T; - }; - - template - struct remove_reference - { - using type = T; - }; - - template - struct remove_reference - { - using type = T; - }; - - - template - struct underlying_type - { - using type = __underlying_type(T); - }; -} diff --git a/third_party/raw_pdb/src/Foundation/PDB_Warnings.h b/third_party/raw_pdb/src/Foundation/PDB_Warnings.h deleted file mode 100644 index fbc8a9d..0000000 --- a/third_party/raw_pdb/src/Foundation/PDB_Warnings.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "PDB_Platform.h" - -#if PDB_COMPILER_MSVC - // some warnings were introduced with different versions of Visual Studio, so we disable this warning instead of using a bunch of #if/#endif -# pragma warning (disable : 4619) // there is no warning number N - - // we compile with exceptions disabled -# pragma warning (disable : 4530) // C++ exception handler used, but unwind semantics are not enabled.Specify / EHsc -# pragma warning (disable : 4577) // 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc - - // ignore purely informational warnings -# pragma warning (disable : 4514) // unreferenced inline function has been removed -# pragma warning (disable : 4710) // function not inlined -# pragma warning (disable : 4711) // function selected for automatic inline expansion -# pragma warning (disable : 4820) // 'N' bytes padding added after data member 'm_member' -# pragma warning (disable : 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified -#elif PDB_COMPILER_CLANG - // turn on absolutely all available Clang warnings -# pragma clang diagnostic warning "-Wall" -# pragma clang diagnostic warning "-Wextra" -# pragma clang diagnostic warning "-Weverything" -# pragma clang diagnostic warning "-Wpedantic" - - // these warnings contradict -Weverything -# pragma clang diagnostic ignored "-Wc++98-compat" -# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" - - // this warning is triggered for templates which are explicitly instantiated. - // forgetting to instantiate the template would trigger a linker error anyway, so we disable this warning. -# pragma clang diagnostic ignored "-Wundefined-func-template" - - // we don't strive for C++20 compatibility -# pragma clang diagnostic ignored "-Wc++20-compat" - - // some structures will have to be padded -# pragma clang diagnostic ignored "-Wpadded" - - // it's impossible to write C++ code using raw pointers without triggering this warning -# pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif diff --git a/third_party/raw_pdb/src/PDB.cpp b/third_party/raw_pdb/src/PDB.cpp deleted file mode 100644 index 0bbd3a7..0000000 --- a/third_party/raw_pdb/src/PDB.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB.h" -#include "PDB_Types.h" -#include "PDB_Util.h" -#include "PDB_RawFile.h" -#include "Foundation/PDB_PointerUtil.h" -#include "Foundation/PDB_CRT.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::ValidateFile(const void* data, size_t size) PDB_NO_EXCEPT -{ - // validate whether there is enough size for the super block - if (size < sizeof(SuperBlock)) - { - return ErrorCode::InvalidDataSize; - } - // validate the super block - const SuperBlock* superBlock = Pointer::Offset(data, 0u); - { - // validate header magic - if (memcmp(superBlock->fileMagic, SuperBlock::MAGIC, sizeof(SuperBlock::MAGIC)) != 0) - { - return ErrorCode::InvalidSuperBlock; - } - - // validate whether enough size is provided for the PDB file - // blockCount * blockSize is the size of the PDB file on disk - if (size < superBlock->blockCount * superBlock->blockSize) - { - return ErrorCode::InvalidDataSize; - } - - // validate free block map. - // the free block map should always reside at either index 1 or 2. - if (superBlock->freeBlockMapIndex != 1u && superBlock->freeBlockMapIndex != 2u) - { - return ErrorCode::InvalidFreeBlockMap; - } - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::RawFile PDB::CreateRawFile(const void* data) PDB_NO_EXCEPT -{ - return RawFile(data); -} diff --git a/third_party/raw_pdb/src/PDB.h b/third_party/raw_pdb/src/PDB.h deleted file mode 100644 index 3f17f9f..0000000 --- a/third_party/raw_pdb/src/PDB.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "PDB_ErrorCodes.h" - - -// https://llvm.org/docs/PDB/index.html -namespace PDB -{ - class RawFile; - - - // Validates whether a PDB file is valid. - PDB_NO_DISCARD ErrorCode ValidateFile(const void* data, size_t size) PDB_NO_EXCEPT; - - // Creates a raw PDB file that must have been validated. - PDB_NO_DISCARD RawFile CreateRawFile(const void* data) PDB_NO_EXCEPT; -} diff --git a/third_party/raw_pdb/src/PDB_CoalescedMSFStream.cpp b/third_party/raw_pdb/src/PDB_CoalescedMSFStream.cpp deleted file mode 100644 index fe544e4..0000000 --- a/third_party/raw_pdb/src/PDB_CoalescedMSFStream.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_CoalescedMSFStream.h" -#include "PDB_Util.h" -#include "PDB_DirectMSFStream.h" -#include "Foundation/PDB_PointerUtil.h" -#include "Foundation/PDB_Memory.h" -#include "Foundation/PDB_CRT.h" - - -namespace -{ - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static bool AreBlockIndicesContiguous(const uint32_t* blockIndices, uint32_t blockSize, uint32_t streamSize) PDB_NO_EXCEPT - { - const uint32_t blockCount = PDB::ConvertSizeToBlockCount(streamSize, blockSize); - - // start with the first index, checking if all following indices are contiguous (N, N+1, N+2, ...) - uint32_t expectedIndex = blockIndices[0]; - for (uint32_t i = 1u; i < blockCount; ++i) - { - ++expectedIndex; - if (blockIndices[i] != expectedIndex) - { - return false; - } - } - - return true; - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream::CoalescedMSFStream(void) PDB_NO_EXCEPT - : m_ownedData(nullptr) - , m_data(nullptr) - , m_size(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream::CoalescedMSFStream(CoalescedMSFStream&& other) PDB_NO_EXCEPT - : m_ownedData(PDB_MOVE(other.m_ownedData)) - , m_data(PDB_MOVE(other.m_data)) - , m_size(PDB_MOVE(other.m_size)) -{ - other.m_ownedData = nullptr; - other.m_data = nullptr; - other.m_size = 0u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream& PDB::CoalescedMSFStream::operator=(CoalescedMSFStream&& other) PDB_NO_EXCEPT -{ - if (this != &other) - { - PDB_DELETE_ARRAY(m_ownedData); - - m_ownedData = PDB_MOVE(other.m_ownedData); - m_data = PDB_MOVE(other.m_data); - m_size = PDB_MOVE(other.m_size); - - other.m_ownedData = nullptr; - other.m_data = nullptr; - other.m_size = 0u; - } - - return *this; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream::CoalescedMSFStream(const void* data, uint32_t blockSize, const uint32_t* blockIndices, uint32_t streamSize) PDB_NO_EXCEPT - : m_ownedData(nullptr) - , m_data(nullptr) - , m_size(streamSize) -{ - if (AreBlockIndicesContiguous(blockIndices, blockSize, streamSize)) - { - // fast path, all block indices are contiguous, so we don't have to copy any data at all. - // instead, we directly point into the memory-mapped file at the correct offset. - const uint32_t index = blockIndices[0]; - const size_t fileOffset = PDB::ConvertBlockIndexToFileOffset(index, blockSize); - m_data = Pointer::Offset(data, fileOffset); - } - else - { - // slower path, we need to copy disjunct blocks into our own data array, block by block - m_ownedData = PDB_NEW_ARRAY(Byte, streamSize); - m_data = m_ownedData; - - Byte* destination = m_ownedData; - - // copy full blocks first - const uint32_t fullBlockCount = streamSize / blockSize; - for (uint32_t i = 0u; i < fullBlockCount; ++i) - { - const uint32_t index = blockIndices[i]; - - // read one single block at the correct offset in the stream - const size_t fileOffset = PDB::ConvertBlockIndexToFileOffset(index, blockSize); - const void* sourceData = Pointer::Offset(data, fileOffset); - memcpy(destination, sourceData, blockSize); - - destination += blockSize; - } - - // account for non-full blocks - const uint32_t remainingBytes = streamSize - (fullBlockCount * blockSize); - if (remainingBytes != 0u) - { - const uint32_t index = blockIndices[fullBlockCount]; - - // read remaining bytes at correct offset in the stream - const size_t fileOffset = PDB::ConvertBlockIndexToFileOffset(index, blockSize); - const void* sourceData = Pointer::Offset(data, fileOffset); - memcpy(destination, sourceData, remainingBytes); - } - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream::CoalescedMSFStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT - : m_ownedData(nullptr) - , m_data(nullptr) - , m_size(size) -{ - const DirectMSFStream::IndexAndOffset indexAndOffset = directStream.GetBlockIndexForOffset(offset); - - // Note: we need to add the offset within the block to the size of the stream to determine if the block - // indices are contiguous. This is needed to deal with the case where reading the requested number of bytes - // from the specified offset would cross a block boundary. For example, if the offset within the block is - // 64 and we want to read 4096 bytes with a block size of 4096, we need to consider *two* block indices, - // not *one*, even though 4096 / 4096 = 1. - if (AreBlockIndicesContiguous(directStream.GetBlockIndices() + indexAndOffset.index, directStream.GetBlockSize(), indexAndOffset.offsetWithinBlock + size)) - { - // fast path, all block indices inside the direct stream from (data + offset) to (data + offset + size) are contiguous - const size_t offsetWithinData = directStream.GetDataOffsetForIndexAndOffset(indexAndOffset); - m_data = Pointer::Offset(directStream.GetData(), offsetWithinData); - } - else - { - // slower path, we need to copy from disjunct blocks, which is performed by the direct stream - m_ownedData = PDB_NEW_ARRAY(Byte, size); - m_data = m_ownedData; - - directStream.ReadAtOffset(m_ownedData, size, offset); - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::CoalescedMSFStream::~CoalescedMSFStream(void) PDB_NO_EXCEPT -{ - PDB_DELETE_ARRAY(m_ownedData); -} diff --git a/third_party/raw_pdb/src/PDB_CoalescedMSFStream.h b/third_party/raw_pdb/src/PDB_CoalescedMSFStream.h deleted file mode 100644 index 09d524c..0000000 --- a/third_party/raw_pdb/src/PDB_CoalescedMSFStream.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Assert.h" -#include "Foundation/PDB_Macros.h" -#include "PDB_Types.h" - -// https://llvm.org/docs/PDB/index.html#the-msf-container -// https://llvm.org/docs/PDB/MsfFile.html -namespace PDB -{ - class PDB_NO_DISCARD DirectMSFStream; - - - // provides access to a coalesced version of an MSF stream. - // inherently thread-safe, the stream doesn't carry any internal offset or similar. - // coalesces all blocks into a contiguous stream of data upon construction. - // very fast individual reads, useful when almost all data of a stream is needed anyway. - class PDB_NO_DISCARD CoalescedMSFStream - { - public: - CoalescedMSFStream(void) PDB_NO_EXCEPT; - CoalescedMSFStream(CoalescedMSFStream&& other) PDB_NO_EXCEPT; - CoalescedMSFStream& operator=(CoalescedMSFStream&& other) PDB_NO_EXCEPT; - - explicit CoalescedMSFStream(const void* data, uint32_t blockSize, const uint32_t* blockIndices, uint32_t streamSize) PDB_NO_EXCEPT; - - // Creates a coalesced stream from a direct stream at any offset. - explicit CoalescedMSFStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT; - - ~CoalescedMSFStream(void) PDB_NO_EXCEPT; - - // Returns the size of the stream. - PDB_NO_DISCARD inline size_t GetSize(void) const PDB_NO_EXCEPT - { - return m_size; - } - - // Provides read-only access to the data. - template - PDB_NO_DISCARD inline const T* GetDataAtOffset(size_t offset) const PDB_NO_EXCEPT - { - return reinterpret_cast(m_data + offset); - } - - template - PDB_NO_DISCARD inline size_t GetPointerOffset(const T* pointer) const PDB_NO_EXCEPT - { - const Byte* bytePointer = reinterpret_cast(pointer); - const Byte* dataEnd = m_data + m_size; - - PDB_ASSERT(bytePointer >= m_data && bytePointer <= dataEnd, "Pointer 0x%p not within stream range [0x%p:0x%p]", - static_cast(bytePointer), static_cast(m_data), static_cast(dataEnd)); - - return static_cast(bytePointer - m_data); - } - - private: - // contiguous, coalesced data, can be null - Byte* m_ownedData; - - // either points to the owned data that has been copied from disjunct blocks, or points to the - // memory-mapped data directly in case all stream blocks are contiguous. - const Byte* m_data; - size_t m_size; - - PDB_DISABLE_COPY(CoalescedMSFStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_DBIStream.cpp b/third_party/raw_pdb/src/PDB_DBIStream.cpp deleted file mode 100644 index 5c9bf15..0000000 --- a/third_party/raw_pdb/src/PDB_DBIStream.cpp +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_DBIStream.h" -#include "PDB_RawFile.h" - - -namespace -{ - // the DBI stream always resides at index 3 - static constexpr const uint32_t DBIStreamIndex = 3u; - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetModuleInfoSubstreamOffset(const PDB::DBI::StreamHeader& /* dbiHeader */) PDB_NO_EXCEPT - { - return sizeof(PDB::DBI::StreamHeader); - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetSectionContributionSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetModuleInfoSubstreamOffset(dbiHeader) + dbiHeader.moduleInfoSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetSectionMapSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetSectionContributionSubstreamOffset(dbiHeader) + dbiHeader.sectionContributionSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetSourceInfoSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetSectionMapSubstreamOffset(dbiHeader) + dbiHeader.sectionMapSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetTypeServerMapSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetSourceInfoSubstreamOffset(dbiHeader) + dbiHeader.sourceInfoSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetECSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetTypeServerMapSubstreamOffset(dbiHeader) + dbiHeader.typeServerMapSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline uint32_t GetDebugHeaderSubstreamOffset(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return GetECSubstreamOffset(dbiHeader) + dbiHeader.ecSize; - } - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline bool HasDebugHeaderSubstream(const PDB::DBI::StreamHeader& dbiHeader) PDB_NO_EXCEPT - { - return dbiHeader.optionalDebugHeaderSize != 0u; - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::DBIStream::DBIStream(void) PDB_NO_EXCEPT - : m_header() - , m_stream() -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::DBIStream::DBIStream(const RawFile& file, const DBI::StreamHeader& header) PDB_NO_EXCEPT - : m_header(header) - , m_stream(file.CreateMSFStream(DBIStreamIndex)) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::HasValidDBIStream(const RawFile& file) PDB_NO_EXCEPT -{ - DirectMSFStream stream = file.CreateMSFStream(DBIStreamIndex); - if (stream.GetSize() < sizeof(DBI::StreamHeader)) - { - return ErrorCode::InvalidStream; - } - - const DBI::StreamHeader header = stream.ReadAtOffset(0u); - if (header.signature != DBI::StreamHeader::Signature) - { - return ErrorCode::InvalidSignature; - } - else if (header.version != DBI::StreamHeader::Version::V70) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::DBIStream PDB::CreateDBIStream(const RawFile& file) PDB_NO_EXCEPT -{ - DirectMSFStream stream = file.CreateMSFStream(DBIStreamIndex); - const DBI::StreamHeader header = stream.ReadAtOffset(0u); - - return DBIStream { file, header }; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::DBIStream::HasValidSymbolRecordStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - return (m_header.symbolRecordStreamIndex != PDB::NilStreamIndex) ? ErrorCode::Success : ErrorCode::InvalidStreamIndex; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::DBIStream::HasValidImageSectionStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - // the debug header stream is optional. if it's not there, we can't get the image section stream either. - if (!HasDebugHeaderSubstream(m_header)) - { - return ErrorCode::InvalidStreamIndex; - } - - // find the debug header sub-stream - const uint32_t debugHeaderOffset = GetDebugHeaderSubstreamOffset(m_header); - - // validate that we have enough data to read the debug header - // (the header field optionalDebugHeaderSize might claim there's a debug header, - // but the stream might not have enough data - this happens with some .ni.pdb files) - if (debugHeaderOffset + sizeof(DBI::DebugHeader) > m_stream.GetSize()) - { - return ErrorCode::InvalidStream; - } - - const DBI::DebugHeader& debugHeader = m_stream.ReadAtOffset(debugHeaderOffset); - - if (debugHeader.sectionHeaderStreamIndex == DBI::DebugHeader::InvalidStreamIndex) - { - return ErrorCode::InvalidStreamIndex; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::DBIStream::HasValidPublicSymbolStream(const RawFile& file) const PDB_NO_EXCEPT -{ - if (m_header.publicStreamIndex == PDB::NilStreamIndex) - { - return ErrorCode::InvalidStreamIndex; - } - - DirectMSFStream publicStream = file.CreateMSFStream(m_header.publicStreamIndex); - - // the public symbol stream always begins with a header, we are not interested in that. - // following the public symbol stream header is a hash table header. - const HashTableHeader hashHeader = publicStream.ReadAtOffset(sizeof(PublicStreamHeader)); - if (hashHeader.signature != HashTableHeader::Signature) - { - return ErrorCode::InvalidSignature; - } - else if (hashHeader.version != HashTableHeader::Version) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::DBIStream::HasValidGlobalSymbolStream(const RawFile& file) const PDB_NO_EXCEPT -{ - if (m_header.globalStreamIndex == PDB::NilStreamIndex) - { - return ErrorCode::InvalidStreamIndex; - } - - DirectMSFStream globalStream = file.CreateMSFStream(m_header.globalStreamIndex); - - // the global symbol stream starts with a hash table header - const HashTableHeader hashHeader = globalStream.ReadAtOffset(0u); - if (hashHeader.signature != HashTableHeader::Signature) - { - return ErrorCode::InvalidSignature; - } - else if (hashHeader.version != HashTableHeader::Version) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::DBIStream::HasValidSectionContributionStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - if (m_header.sectionContributionSize < sizeof(DBI::SectionContribution::Version)) - { - return ErrorCode::InvalidStream; - } - - // find the section contribution sub-stream - // https://llvm.org/docs/PDB/DbiStream.html#section-contribution-substream - const uint32_t streamOffset = GetSectionContributionSubstreamOffset(m_header); - - const DBI::SectionContribution::Version version = m_stream.ReadAtOffset(streamOffset); - if (version != DBI::SectionContribution::Version::Ver60) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::CoalescedMSFStream PDB::DBIStream::CreateSymbolRecordStream(const RawFile& file) const PDB_NO_EXCEPT -{ - // the symbol record stream holds the actual CodeView data of the symbols - return file.CreateMSFStream(m_header.symbolRecordStreamIndex); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ImageSectionStream PDB::DBIStream::CreateImageSectionStream(const RawFile& file) const PDB_NO_EXCEPT -{ - // find the debug header sub-stream - const uint32_t debugHeaderOffset = GetDebugHeaderSubstreamOffset(m_header); - const DBI::DebugHeader& debugHeader = m_stream.ReadAtOffset(debugHeaderOffset); - - // from there, grab the section header stream - return ImageSectionStream(file, debugHeader.sectionHeaderStreamIndex); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::PublicSymbolStream PDB::DBIStream::CreatePublicSymbolStream(const RawFile& file) const PDB_NO_EXCEPT -{ - DirectMSFStream publicStream = file.CreateMSFStream(m_header.publicStreamIndex); - - // the public symbol stream always begins with a header, we are not interested in that. - // following the public symbol stream header is a hash table header. - // we use this to work out how many symbol records are referenced by the public symbol stream. - const HashTableHeader hashHeader = publicStream.ReadAtOffset(sizeof(PublicStreamHeader)); - const uint32_t recordCount = hashHeader.size / sizeof(HashRecord); - - return PublicSymbolStream(file, m_header.publicStreamIndex, recordCount); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::GlobalSymbolStream PDB::DBIStream::CreateGlobalSymbolStream(const RawFile& file) const PDB_NO_EXCEPT -{ - DirectMSFStream globalStream = file.CreateMSFStream(m_header.globalStreamIndex); - - // the global symbol stream starts with a hash table header. - // we use this to work out how many symbol records are referenced by the global symbol stream. - const HashTableHeader hashHeader = globalStream.ReadAtOffset(0u); - const uint32_t recordCount = hashHeader.size / sizeof(HashRecord); - - return GlobalSymbolStream(file, m_header.globalStreamIndex, recordCount); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::SourceFileStream PDB::DBIStream::CreateSourceFileStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - // find the source info sub-stream - // https://llvm.org/docs/PDB/DbiStream.html#file-info-substream - const uint32_t streamOffset = GetSourceInfoSubstreamOffset(m_header); - - return SourceFileStream(m_stream, m_header.sourceInfoSize, streamOffset); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::SectionContributionStream PDB::DBIStream::CreateSectionContributionStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - // find the section contribution sub-stream - // https://llvm.org/docs/PDB/DbiStream.html#section-contribution-substream - const uint32_t streamOffset = GetSectionContributionSubstreamOffset(m_header); - - return SectionContributionStream(m_stream, m_header.sectionContributionSize - sizeof(DBI::SectionContribution::Version), streamOffset + sizeof(DBI::SectionContribution::Version)); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ModuleInfoStream PDB::DBIStream::CreateModuleInfoStream(const RawFile& /* file */) const PDB_NO_EXCEPT -{ - // find the module info sub-stream - // https://llvm.org/docs/PDB/DbiStream.html#module-info-substream - const uint32_t streamOffset = GetModuleInfoSubstreamOffset(m_header); - - return ModuleInfoStream(m_stream, m_header.moduleInfoSize, streamOffset); -} diff --git a/third_party/raw_pdb/src/PDB_DBIStream.h b/third_party/raw_pdb/src/PDB_DBIStream.h deleted file mode 100644 index 4b52598..0000000 --- a/third_party/raw_pdb/src/PDB_DBIStream.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "PDB_ErrorCodes.h" -#include "PDB_DBITypes.h" -#include "PDB_CoalescedMSFStream.h" -#include "PDB_DirectMSFStream.h" -#include "PDB_ImageSectionStream.h" -#include "PDB_PublicSymbolStream.h" -#include "PDB_GlobalSymbolStream.h" -#include "PDB_SourceFileStream.h" -#include "PDB_SectionContributionStream.h" -#include "PDB_ModuleInfoStream.h" - - -// PDB DBI Stream -// https://llvm.org/docs/PDB/DbiStream.html -namespace PDB -{ - class RawFile; - - - class PDB_NO_DISCARD DBIStream - { - public: - DBIStream(void) PDB_NO_EXCEPT; - explicit DBIStream(const RawFile& file, const DBI::StreamHeader& header) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(DBIStream); - - PDB_NO_DISCARD ErrorCode HasValidSymbolRecordStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ErrorCode HasValidImageSectionStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ErrorCode HasValidPublicSymbolStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ErrorCode HasValidGlobalSymbolStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ErrorCode HasValidSectionContributionStream(const RawFile& file) const PDB_NO_EXCEPT; - - PDB_NO_DISCARD CoalescedMSFStream CreateSymbolRecordStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ImageSectionStream CreateImageSectionStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD PublicSymbolStream CreatePublicSymbolStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD GlobalSymbolStream CreateGlobalSymbolStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD SourceFileStream CreateSourceFileStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD SectionContributionStream CreateSectionContributionStream(const RawFile& file) const PDB_NO_EXCEPT; - PDB_NO_DISCARD ModuleInfoStream CreateModuleInfoStream(const RawFile& file) const PDB_NO_EXCEPT; - - PDB_NO_DISCARD const DBI::StreamHeader& GetHeader(void) const PDB_NO_EXCEPT - { - return m_header; - } - - private: - DBI::StreamHeader m_header; - DirectMSFStream m_stream; - - PDB_DISABLE_COPY(DBIStream); - }; - - // Returns whether the given raw file provides a valid DBI stream. - PDB_NO_DISCARD ErrorCode HasValidDBIStream(const RawFile& file) PDB_NO_EXCEPT; - - // Creates the DBI stream from a raw file. - PDB_NO_DISCARD DBIStream CreateDBIStream(const RawFile& file) PDB_NO_EXCEPT; -} diff --git a/third_party/raw_pdb/src/PDB_DBITypes.cpp b/third_party/raw_pdb/src/PDB_DBITypes.cpp deleted file mode 100644 index 4eaedcf..0000000 --- a/third_party/raw_pdb/src/PDB_DBITypes.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_DBITypes.h" - - -const uint32_t PDB::DBI::StreamHeader::Signature = 0xffffffffu; -const uint16_t PDB::DBI::DebugHeader::InvalidStreamIndex = 0xFFFFu; diff --git a/third_party/raw_pdb/src/PDB_DBITypes.h b/third_party/raw_pdb/src/PDB_DBITypes.h deleted file mode 100644 index 9a798d4..0000000 --- a/third_party/raw_pdb/src/PDB_DBITypes.h +++ /dev/null @@ -1,928 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_BitOperators.h" - - -namespace PDB -{ - namespace DBI - { - // https://llvm.org/docs/PDB/DbiStream.html#stream-header - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/dbi/dbi.h#L124 - struct StreamHeader - { - static const uint32_t Signature; - - enum class PDB_NO_DISCARD Version : uint32_t - { - VC41 = 930803u, - V50 = 19960307u, - V60 = 19970606u, - V70 = 19990903u, - V110 = 20091201u - }; - - uint32_t signature; - Version version; - uint32_t age; - uint16_t globalStreamIndex; // index of the global symbol stream - uint16_t toolchain; - uint16_t publicStreamIndex; // index of the public symbol stream - uint16_t pdbDllVersion; - uint16_t symbolRecordStreamIndex; // index of the symbol record stream - uint16_t pdbDllRbld; - uint32_t moduleInfoSize; - uint32_t sectionContributionSize; - uint32_t sectionMapSize; - uint32_t sourceInfoSize; - uint32_t typeServerMapSize; - uint32_t mfcTypeServerIndex; - uint32_t optionalDebugHeaderSize; - uint32_t ecSize; - uint16_t flags; - uint16_t machine; - uint32_t padding; - }; - - // https://llvm.org/docs/PDB/DbiStream.html#optional-debug-header-stream - struct DebugHeader - { - static const uint16_t InvalidStreamIndex; - - uint16_t fpoDataStreamIndex; // IMAGE_DEBUG_TYPE_FPO - uint16_t exceptionDataStreamIndex; // IMAGE_DEBUG_TYPE_EXCEPTION - uint16_t fixupDataStreamIndex; // IMAGE_DEBUG_TYPE_FIXUP - uint16_t omapToSrcDataStreamIndex; // IMAGE_DEBUG_TYPE_OMAP_TO_SRC - uint16_t omapFromSrcDataStreamIndex; // IMAGE_DEBUG_TYPE_OMAP_FROM_SRC - uint16_t sectionHeaderStreamIndex; // a dump of all section headers (IMAGE_SECTION_HEADER) from the original executable - uint16_t tokenDataStreamIndex; - uint16_t xdataStreamIndex; - uint16_t pdataStreamIndex; - uint16_t newFpoDataStreamIndex; - uint16_t originalSectionHeaderDataStreamIndex; - }; - - // https://llvm.org/docs/PDB/DbiStream.html#section-contribution-substream - struct SectionContribution - { - enum class PDB_NO_DISCARD Version : uint32_t - { - Ver60 = 0xeffe0000u + 19970605u, - V2 = 0xeffe0000u + 20140516u - }; - - uint16_t section; - uint16_t padding; - uint32_t offset; - uint32_t size; - uint32_t characteristics; - uint16_t moduleIndex; - uint16_t padding2; - uint32_t dataCrc; - uint32_t relocationCrc; - }; - - // https://llvm.org/docs/PDB/DbiStream.html#module-info-substream - struct ModuleInfo - { - uint32_t unused; - SectionContribution sectionContribution; - uint16_t flags; - uint16_t moduleSymbolStreamIndex; - uint32_t symbolSize; - uint32_t c11Size; - uint32_t c13Size; - uint16_t sourceFileCount; - uint16_t padding; - uint32_t unused2; - uint32_t sourceFileNameIndex; - uint32_t pdbFilePathNameIndex; - }; - } - - - namespace CodeView - { - namespace DBI - { - // code view type records that can appear in a DBI stream. - // this list is not exhaustive, but only contains what we need so far. - // https://llvm.org/docs/PDB/CodeViewSymbols.html - // https://llvm.org/docs/PDB/TpiStream.html#tpi-vs-ipi-stream - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2735 - enum class PDB_NO_DISCARD SymbolRecordKind : uint16_t - { - S_END = 0x0006u, // block, procedure, "with" or thunk end - S_SKIP = 0x0007u, // Reserve symbol space in $$Symbols table - S_FRAMEPROC = 0x1012u, // extra frame and proc information - S_ANNOTATION = 0x1019u, // annotation string literals ("__annotation" intrinsic, e.g. via NT_ASSERT) - S_OBJNAME = 0x1101u, // full path to the original compiled .obj. can point to remote locations and temporary files, not necessarily the file that was linked into the executable - S_THUNK32 = 0x1102u, // thunk start - S_BLOCK32 = 0x1103u, // block start - S_LABEL32 = 0x1105u, // code label - S_REGISTER = 0x1106u, // register variable - S_CONSTANT = 0x1107u, // constant symbol - S_BPREL32 = 0x110Bu, // BP-relative address (almost like S_REGREL32) - S_LDATA32 = 0x110Cu, // (static) local data - S_GDATA32 = 0x110Du, // global data - S_PUB32 = 0x110Eu, // public symbol - S_LPROC32 = 0x110Fu, // local procedure start - S_GPROC32 = 0x1110u, // global procedure start - S_REGREL32 = 0x1111u, // register relative address - S_LTHREAD32 = 0x1112u, // (static) thread-local data - S_GTHREAD32 = 0x1113u, // global thread-local data - S_UNAMESPACE = 0x1124u, // using namespace - S_PROCREF = 0x1125u, // reference to function in any compiland - S_LPROCREF = 0x1127u, // local reference to function in any compiland - S_TRAMPOLINE = 0x112Cu, // incremental linking trampoline - S_SEPCODE = 0x1132u, // separated code (from the compiler) - S_SECTION = 0x1136u, // a COFF section in an executable - S_COFFGROUP = 0x1137u, // original COFF group before it was merged into executable sections by the linker, e.g. .CRT$XCU, .rdata, .bss, .lpp_prepatch_hooks - S_CALLSITEINFO = 0x1139u, // Indirect call site information - S_FRAMECOOKIE = 0x113Au, // Security cookie information - S_COMPILE3 = 0x113Cu, // replacement for S_COMPILE2, more info - S_ENVBLOCK = 0x113Du, // environment block split off from S_COMPILE2 - S_LOCAL = 0x113Eu, // defines a local symbol in optimized code - S_DEFRANGE_REGISTER = 0x1141u, // ranges for en-registered symbol - S_DEFRANGE_FRAMEPOINTER_REL = 0x1142u, // range for stack symbol. - S_DEFRANGE_SUBFIELD_REGISTER = 0x1143u, // ranges for en-registered field of symbol - S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144u, // range for stack symbol span valid full scope of function body, gap might apply. - S_DEFRANGE_REGISTER_REL = 0x1145u, // range for symbol address as register + offset. - S_LPROC32_ID = 0x1146u, // S_PROC symbol that references ID instead of type - S_GPROC32_ID = 0x1147u, // S_PROC symbol that references ID instead of type - S_BUILDINFO = 0x114Cu, // build info/environment details of a compiland/translation unit - S_INLINESITE = 0x114Du, // inlined function callsite - S_INLINESITE_END = 0x114Eu, - S_PROC_ID_END = 0x114Fu, - S_FILESTATIC = 0x1153u, - S_LPROC32_DPC = 0x1155u, - S_LPROC32_DPC_ID = 0x1156u, - S_ARMSWITCHTABLE = 0x1159u, - S_CALLEES = 0x115Au, - S_CALLERS = 0x115Bu, - S_INLINESITE2 = 0x115Du, // extended inline site information - S_HEAPALLOCSITE = 0x115Eu, // heap allocation site - S_INLINEES = 0x1168u, // https://llvm.org/docs/PDB/CodeViewSymbols.html#s-inlinees-0x1168 - S_REGREL32_INDIR = 0x1171u, - S_REGREL32_ENCTMP = 0x1179u, - S_UDT = 0x1108u, // user-defined type - S_UDT_ST = 0x1003u, // user-defined structured types - }; - - // https://docs.microsoft.com/en-us/visualstudio/debugger/debug-interface-access/thunk-ordinal - enum class PDB_NO_DISCARD ThunkOrdinal : uint8_t - { - NoType, - ThisAdjustor, - VirtualCall, - PCode, - DelayLoad, - TrampolineIncremental, - TrampolineBranchIsland - }; - - enum class PDB_NO_DISCARD TrampolineType : uint16_t - { - Incremental, - BranchIsland - }; - - enum class PDB_NO_DISCARD CookieType : uint8_t - { - COPY = 0, - XOR_SP, - XOR_BP, - XOR_R13, - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvconst.h#L392 - enum class PDB_NO_DISCARD Register : uint16_t - { - EAX = 17, - ECX = 18, - EDX = 19, - EBX = 20, - ESP = 21, - EBP = 22, - ESI = 23, - EDI = 24, - - RAX = 328, - RBX = 329, - RCX = 330, - RDX = 331, - RSI = 332, - RDI = 333, - RBP = 334, - RSP = 335, - R8 = 336, - R9 = 337, - R10 = 338, - R11 = 339, - R12 = 340, - R13 = 341, - R14 = 342, - R15 = 343, - - RIP = 33, // also EIP for x32 - EFLAGS = 34, // same for x64 and x32 - }; - - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3038 - enum class PDB_NO_DISCARD ProcedureFlags : uint8_t - { - None = 0u, - NoFPO = 1u << 0u, - InterruptReturn = 1u << 1u, - FarReturn = 1u << 2u, - NoReturn = 1u << 3u, - Unreachable = 1u << 4u, - CustomCallingConvention = 1u << 5u, - NoInline = 1u << 6u, - OptimizedDebugInformation = 1u << 7u - }; - PDB_DEFINE_BIT_OPERATORS(ProcedureFlags); - - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3676 - enum class PDB_NO_DISCARD PublicSymbolFlags : uint32_t - { - None = 0u, - Code = 1u << 0u, // set if public symbol refers to a code address - Function = 1u << 1u, // set if public symbol is a function - ManagedCode = 1u << 2u, // set if managed code (native or IL) - ManagedILCode = 1u << 3u // set if managed IL code - }; - PDB_DEFINE_BIT_OPERATORS(PublicSymbolFlags); - - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3341 - enum class PDB_NO_DISCARD CompileSymbolFlags : uint32_t - { - None = 0u, - SourceLanguageMask = 0xFFu, - EC = 1u << 8u, - NoDebugInfo = 1u << 9u, - LTCG = 1u << 10u, - NoDataAlign = 1u << 11u, - ManagedCodeOrDataPresent = 1u << 12u, - SecurityChecks = 1u << 13u, - HotPatch = 1u << 14u, - CVTCIL = 1u << 15u, - MSILModule = 1u << 16u, - SDL = 1u << 17u, - PGO = 1u << 18u, - Exp = 1u << 19u - }; - PDB_DEFINE_BIT_OPERATORS(CompileSymbolFlags); - - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvconst.h#L324 - enum class PDB_NO_DISCARD CPUType : uint16_t - { - Intel8080 = 0x0, - Intel8086 = 0x1, - Intel80286 = 0x2, - Intel80386 = 0x3, - Intel80486 = 0x4, - Pentium = 0x5, - PentiumII = 0x6, - PentiumPro = PentiumII, - PentiumIII = 0x7, - MIPS = 0x10, - MIPSR4000 = MIPS, - MIPS16 = 0x11, - MIPS32 = 0x12, - MIPS64 = 0x13, - MIPSI = 0x14, - MIPSII = 0x15, - MIPSIII = 0x16, - MIPSIV = 0x17, - MIPSV = 0x18, - M68000 = 0x20, - M68010 = 0x21, - M68020 = 0x22, - M68030 = 0x23, - M68040 = 0x24, - Alpha = 0x30, - Alpha21164 = 0x31, - Alpha21164A = 0x32, - Alpha21264 = 0x33, - Alpha21364 = 0x34, - PPC601 = 0x40, - PPC603 = 0x41, - PPC604 = 0x42, - PPC620 = 0x43, - PPCFP = 0x44, - PPCBE = 0x45, - SH3 = 0x50, - SH3E = 0x51, - SH3DSP = 0x52, - SH4 = 0x53, - SHMedia = 0x54, - ARM3 = 0x60, - ARM4 = 0x61, - ARM4T = 0x62, - ARM5 = 0x63, - ARM5T = 0x64, - ARM6 = 0x65, - ARM_XMAC = 0x66, - ARM_WMMX = 0x67, - ARM7 = 0x68, - Omni = 0x70, - IA64 = 0x80, - IA64_1 = 0x80, - IA64_2 = 0x81, - CEE = 0x90, - AM33 = 0xA0, - M32R = 0xB0, - TriCore = 0xC0, - X64 = 0xD0, - AMD64 = X64, - EBC = 0xE0, - Thumb = 0xF0, - ARMNT = 0xF4, - ARM64 = 0xF6, - HybridX86ARM64 = 0xF7, - ARM64EC = 0xF8, - ARM64X = 0xF9, - D3D11_Shader = 0x100 - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3100 - // represents an address range, used for optimized code debug info - struct LocalVariableAddressRange // defines a range of addresses - { - uint32_t offsetStart; - uint16_t isectionStart; - uint16_t length; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3108 - // Represents the holes in overall address range, all address is pre-bbt. - // it is for compress and reduce the amount of relocations need. - struct LocalVariableAddressGap - { - uint16_t offset; // relative offset from the beginning of the live range. - uint16_t length; // length of this gap. - }; - - // https://github.com/microsoft/microsoft-pdb/blob/0fe89a942f9a0f8e061213313e438884f4c9b876/include/cvinfo.h#L4366 - // https://github.com/microsoft/microsoft-pdb/blob/0fe89a942f9a0f8e061213313e438884f4c9b876/cvdump/dumpsym7.cpp#L5518 - enum class ARMSwitchType : uint16_t - { - INT1 = 0, // signed byte - UINT1 = 1, // unsigned byte - INT2 = 2, // signed two byte - UINT2 = 3, // unsigned two byte - INT4 = 4, // signed four byte - UINT4 = 5, // unsigned four byte - POINTER = 6, - UINT1SHL1 = 7, // unsigned byte scaled by two - UINT2SHL1 = 8, // unsigned two byte scaled by two - INT1SHL1 = 9, // signed byte scaled by two - INT2SHL1 = 10, // signed two byte scaled by two - TBB = UINT1SHL1, - TBH = UINT2SHL1, - }; - - // https://llvm.org/docs/PDB/CodeViewTypes.html#leaf-types - struct RecordHeader - { - uint16_t size; // record length, not including this 2-byte field - SymbolRecordKind kind; // record kind - }; - - // all CodeView records are stored as a header, followed by variable-length data. - // internal Record structs such as S_PUB32, S_GDATA32, etc. correspond to the data layout of a CodeView record of that kind. - struct Record - { - RecordHeader header; - union Data - { -#pragma pack(push, 1) - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4069 - struct - { - uint32_t cbFrame; // count of bytes of total frame of procedure - uint32_t cbPad; // count of bytes of padding in the frame - uint32_t offPad; // offset (relative to frame poniter) to where - // padding starts - uint32_t cbSaveRegs; // count of bytes of callee save registers - uint32_t offExHdlr; // offset of exception handler - uint16_t sectExHdlr; // section id of exception handler - - struct { - uint32_t fHasAlloca : 1; // function uses _alloca() - uint32_t fHasSetJmp : 1; // function uses setjmp() - uint32_t fHasLongJmp : 1; // function uses longjmp() - uint32_t fHasInlAsm : 1; // function uses inline asm - uint32_t fHasEH : 1; // function has EH states - uint32_t fInlSpec : 1; // function was speced as inline - uint32_t fHasSEH : 1; // function has SEH - uint32_t fNaked : 1; // function is __declspec(naked) - uint32_t fSecurityChecks : 1; // function has buffer security check introduced by /GS. - uint32_t fAsyncEH : 1; // function compiled with /EHa - uint32_t fGSNoStackOrdering : 1; // function has /GS buffer checks, but stack ordering couldn't be done - uint32_t fWasInlined : 1; // function was inlined within another function - uint32_t fGSCheck : 1; // function is __declspec(strict_gs_check) - uint32_t fSafeBuffers : 1; // function is __declspec(safebuffers) - uint32_t encodedLocalBasePointer : 2; // record function's local pointer explicitly. - uint32_t encodedParamBasePointer : 2; // record function's parameter pointer explicitly. - uint32_t fPogoOn : 1; // function was compiled with PGO/PGU - uint32_t fValidCounts : 1; // Do we have valid Pogo counts? - uint32_t fOptSpeed : 1; // Did we optimize for speed? - uint32_t fGuardCF : 1; // function contains CFG checks (and no write checks) - uint32_t fGuardCFW : 1; // function contains CFW checks and/or instrumentation - uint32_t pad : 9; // must be zero - } flags; - } S_FRAMEPROC; - - struct - { - uint32_t offset; - uint16_t section; - uint16_t annotationsCount; // number of zero-terminated annotation strings - PDB_FLEXIBLE_ARRAY_MEMBER(char, annotations); // sequence of zero-terminated annotation strings - } S_ANNOTATIONSYM; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3696 - struct - { - PublicSymbolFlags flags; - uint32_t offset; - uint16_t section; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_PUB32; - - struct - { - uint32_t typeIndex; - uint32_t offset; - uint16_t section; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_GDATA32, S_GTHREAD32, S_LDATA32, S_LTHREAD32; - - struct - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_UNAMESPACE; - - struct - { - uint32_t signature; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_OBJNAME; - - struct - { - TrampolineType type; - uint16_t size; - uint32_t thunkOffset; - uint32_t targetOffset; - uint16_t thunkSection; - uint16_t targetSection; - } S_TRAMPOLINE; - - struct - { - uint16_t sectionNumber; - uint8_t alignment; - uint32_t rva; - uint32_t length; - uint32_t characteristics; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_SECTION; - - struct - { - uint32_t size; - uint32_t characteristics; - uint32_t offset; - uint16_t section; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_COFFGROUP; - - struct - { - uint32_t offset ; // offset of call site - uint16_t section; // section index of call site - uint16_t padding; // alignment padding field, must be zero - uint32_t typeIndex; // type index describing function signature - } S_CALLSITEINFO; - - struct - { - uint32_t offset; // Frame relative offset - uint16_t reg; // Register index - CookieType cookietype; // Type of the cookie - uint8_t flags; // Flags describing this cookie - } S_FRAMECOOKIE; - - struct - { - uint32_t parent; - uint32_t end; - uint32_t next; - uint32_t offset; - uint16_t section; - uint16_t length; - ThunkOrdinal thunk; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_THUNK32; - - struct - { - uint32_t parent; - uint32_t end; - uint32_t next; - uint32_t codeSize; - uint32_t debugStart; - uint32_t debugEnd; - uint32_t typeIndex; - uint32_t offset; - uint16_t section; - ProcedureFlags flags; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_LPROC32, S_GPROC32, S_LPROC32_ID, S_GPROC32_ID, S_LPROC32_DPC, S_LPROC32_DPC_ID; - - struct - { - uint32_t offset; - uint32_t typeIndex; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_BPRELSYM32; - - struct - { - uint32_t offset; - uint32_t typeIndex; - Register reg; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_REGREL32, S_REGREL32_ENCTMP; - - struct - { - uint32_t typeIndex; - Register reg; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_REGSYM; - - struct - { - uint32_t parent; - uint32_t end; - uint32_t codeSize; - uint32_t offset; - uint16_t section; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_BLOCK32; - - struct - { - uint32_t offset; - uint16_t section; - ProcedureFlags flags; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_LABEL32; - - struct - { - uint32_t typeIndex; - uint16_t value; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_CONSTANT; - - struct - { - uint32_t typeIndex; // refers to a type index in the IPI stream - } S_BUILDINFO; - - struct - { - uint32_t parent; // pointer to the inliner - uint32_t end; // pointer to this block's end - uint32_t inlinee; // CV_ItemId of inlinee - PDB_FLEXIBLE_ARRAY_MEMBER(uint8_t, binaryAnnotations); - } S_INLINESITE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4199 - struct - { - uint32_t typeIndex; // type index - uint32_t moduleFilenameOffset; // index of mod filename in stringtable - - struct - { - uint16_t fIsParam : 1; // variable is a parameter - uint16_t fAddrTaken : 1; // address is taken - uint16_t fCompGenx : 1; // variable is compiler generated - uint16_t fIsAggregate : 1; // the symbol is splitted in temporaries, - // which are treated by compiler as - // independent entities - uint16_t fIsAggregated : 1; // Counterpart of fIsAggregate - tells - // that it is a part of a fIsAggregate symbol - uint16_t fIsAliased : 1; // variable has multiple simultaneous lifetimes - uint16_t fIsAlias : 1; // represents one of the multiple simultaneous lifetimes - uint16_t fIsRetValue : 1; // represents a function return value - uint16_t fIsOptimizedOut : 1; // variable has no lifetimes - uint16_t fIsEnregGlob : 1; // variable is an enregistered global - uint16_t fIsEnregStat : 1; // variable is an enregistered static - uint16_t unused : 5; // must be zero - } flags; - - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_FILESTATIC; - - struct - { - CompileSymbolFlags flags; - CPUType machine; - uint16_t versionFrontendMajor; - uint16_t versionFrontendMinor; - uint16_t versionFrontendBuild; - uint16_t versionFrontendQFE; - uint16_t versionBackendMajor; - uint16_t versionBackendMinor; - uint16_t versionBackendBuild; - uint16_t versionBackendQFE; - PDB_FLEXIBLE_ARRAY_MEMBER(char, version); - } S_COMPILE3; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L3372 - struct - { - uint8_t flags; - PDB_FLEXIBLE_ARRAY_MEMBER(char, strings); - } S_ENVBLOCK; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4190 - struct - { - uint32_t typeIndex; - - struct - { - uint16_t fIsParam : 1; // variable is a parameter - uint16_t fAddrTaken : 1; // address is taken - uint16_t fCompGenx : 1; // variable is compiler generated - uint16_t fIsAggregate : 1; // the symbol is splitted in temporaries, - // which are treated by compiler as - // independent entities - uint16_t fIsAggregated : 1; // Counterpart of fIsAggregate - tells - // that it is a part of a fIsAggregate symbol - uint16_t fIsAliased : 1; // variable has multiple simultaneous lifetimes - uint16_t fIsAlias : 1; // represents one of the multiple simultaneous lifetimes - uint16_t fIsRetValue : 1; // represents a function return value - uint16_t fIsOptimizedOut : 1; // variable has no lifetimes - uint16_t fIsEnregGlob : 1; // variable is an enregistered global - uint16_t fIsEnregStat : 1; // variable is an enregistered static - uint16_t unused : 5; // must be zero - } flags; - - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_LOCAL; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4236 - struct - { - uint16_t reg; // Register to hold the value of the symbol - - struct - { - uint16_t maybe : 1; // May have no user name on one of control flow path. - uint16_t padding : 15; // Padding for future use. - } attribute; // Attribute of the register range. - - LocalVariableAddressRange range; // Range of addresses where this program is valid - PDB_FLEXIBLE_ARRAY_MEMBER(LocalVariableAddressGap, gaps); // The value is not available in following gaps. - } S_DEFRANGE_REGISTER; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4245 - struct - { - uint32_t offsetFramePointer; - LocalVariableAddressRange range; // Range of addresses where this program is valid - PDB_FLEXIBLE_ARRAY_MEMBER(LocalVariableAddressGap, gaps); // The value is not available in following gaps. - } S_DEFRANGE_FRAMEPOINTER_REL; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4265 - struct - { - uint16_t reg; // Register to hold the value of the symbol - - struct - { - uint16_t maybe : 1; // May have no user name on one of control flow path. - uint16_t padding : 15; // Padding for future use. - } attribute; // Attribute of the register range. - - uint32_t offsetParent : 12; // Offset in parent variable. - uint32_t padding : 20; // Padding for future use. - LocalVariableAddressRange range; // Range of addresses where this program is valid - PDB_FLEXIBLE_ARRAY_MEMBER(LocalVariableAddressGap, gaps); // The value is not available in following gaps. - } S_DEFRANGE_SUBFIELD_REGISTER; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4255 - struct - { - uint32_t offsetFramePointer; // offset to frame pointer - } S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4279 - struct - { - uint16_t baseRegister; // Register to hold the base pointer of the symbol - uint16_t spilledUDTMember : 1; // Spilled member for s.i. - uint16_t padding : 3; // Padding for future use. - uint16_t offsetParent : 12; // Offset in parent variable. - uint32_t offsetBasePointer; // offset to register - LocalVariableAddressRange range; // Range of addresses where this program is valid - PDB_FLEXIBLE_ARRAY_MEMBER(LocalVariableAddressGap, gaps); // The value is not available in following gaps. - } S_DEFRANGE_REGISTER_REL; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4500 - struct - { - uint32_t offset; // offset of call site - uint16_t section; // section index of call site - uint16_t instructionLength; // length of heap allocation call instruction - uint32_t typeIndex; // type index describing function signature - } S_HEAPALLOCSITE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4402 - struct - { - uint32_t offsetBase; // Section-relative offset to the base for switch offsets - uint16_t sectionBase; // Section index of the base for switch offsets - ARMSwitchType switchType; // type of each entry - uint32_t offsetBranch; // Section-relative offset to the table branch instruction - uint32_t offsetTable; // Section-relative offset to the start of the table - uint16_t sectionBranch; // Section index of the table branch instruction - uint16_t sectionTable; // Section index of the table - uint32_t numEntries; // number of switch table entries - } S_ARMSWITCHTABLE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4382 - struct - { - uint32_t count; // Number of functions - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, funcs); // List of functions, dim == count - // uint32_t invocations[CV_ZEROLEN]; Followed by a parallel array of - // invocation counts. Counts > reclen are assumed to be zero - } S_CALLERS, S_CALLEES, S_INLINEES; - - struct - { - uint32_t typeIndex; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } S_UDT, S_UDT_ST; - - struct - { - uint32_t unknown1; - uint32_t typeIndex; - uint32_t unknown2; - Register reg; - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - - } S_REGREL32_INDIR; -#pragma pack(pop) - } data; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4576 - enum class PDB_NO_DISCARD DebugSubsectionKind : uint32_t - { - S_IGNORE = 0x80000000, // if this bit is set in a subsection type then ignore the subsection contents - - S_SYMBOLS = 0xF1, - S_LINES = 0xF2, - S_STRINGTABLE = 0xF3, - S_FILECHECKSUMS = 0xF4, - S_FRAMEDATA = 0xF5, - S_INLINEELINES = 0xF6, - S_CROSSSCOPEIMPORTS = 0xF7, - S_CROSSSCOPEEXPORTS = 0xF8, - - S_IL_LINES = 0xF9, - S_FUNC_MDTOKEN_MAP = 0xFA, - S_TYPE_MDTOKEN_MAP = 0xFB, - S_MERGED_ASSEMBLYINPUT = 0xFC, - - S_COFF_SYMBOL_RVA = 0xFD, - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4596 - struct DebugSubsectionHeader - { - DebugSubsectionKind kind; - uint32_t size; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4617 - struct Line - { - uint32_t offset; // Offset to start of code bytes for line number - uint32_t linenumStart : 24; // line where statement/expression starts - uint32_t deltaLineEnd : 7; // delta to line where statement ends (optional) - uint32_t fStatement : 1; // true if a statement linenumber, else an expression line num - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4630 - struct Column - { - uint16_t start; - uint16_t end; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4601 - struct LinesHeader - { - uint32_t sectionOffset; - uint16_t sectionIndex; - struct - { - uint16_t fHasColumns : 1; - uint16_t pad : 15; - } flags; - - uint32_t codeSize; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4608 - struct LinesFileBlockHeader - { - uint32_t fileChecksumOffset; - uint32_t numLines; - uint32_t size; - // Line lines[numLines]; - // Column columns[numLines]; Might not be present - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvconst.h#L88 - enum class PDB_NO_DISCARD ChecksumKind : uint8_t - { - None = 0, - MD5 = 1, - SHA1 = 2, - SHA256 = 3, - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/cvdump/dumpsym7.cpp#L1097 - struct FileChecksumHeader - { - uint32_t filenameOffset; - uint8_t checksumSize; - ChecksumKind checksumKind; - PDB_FLEXIBLE_ARRAY_MEMBER(uint8_t, checksum); - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4822 - enum class InlineeSourceLineKind : uint32_t - { - Signature = 0, - SignatureEx = 1, - }; - - struct InlineeSourceLineHeader - { - InlineeSourceLineKind kind; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L4825 - struct InlineeSourceLine - { - uint32_t inlinee; - uint32_t fileChecksumOffset; - uint32_t lineNumber; - }; - - struct InlineeSourceLineEx - { - uint32_t inlinee; - uint32_t fileChecksumOffset; - uint32_t lineNumber; - uint32_t extraLines; - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, extrafileChecksumOffsets); - }; - - // Combine DebugSubsectionHeader and first subsection header into one struct. - struct LineSection - { - DebugSubsectionHeader header; - union - { - LinesHeader linesHeader; - FileChecksumHeader checksumHeader; - InlineeSourceLineHeader inlineeHeader; - }; - }; - } - } -} diff --git a/third_party/raw_pdb/src/PDB_DirectMSFStream.cpp b/third_party/raw_pdb/src/PDB_DirectMSFStream.cpp deleted file mode 100644 index 442dc76..0000000 --- a/third_party/raw_pdb/src/PDB_DirectMSFStream.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_DirectMSFStream.h" -#include "Foundation/PDB_PointerUtil.h" -#include "Foundation/PDB_BitUtil.h" -#include "Foundation/PDB_Assert.h" -#include "Foundation/PDB_CRT.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::DirectMSFStream::DirectMSFStream(void) PDB_NO_EXCEPT - : m_data(nullptr) - , m_blockIndices(nullptr) - , m_blockSize(0u) - , m_size(0u) - , m_blockSizeLog2(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::DirectMSFStream::DirectMSFStream(const void* data, uint32_t blockSize, const uint32_t* blockIndices, uint32_t streamSize) PDB_NO_EXCEPT - : m_data(data) - , m_blockIndices(blockIndices) - , m_blockSize(blockSize) - , m_size(streamSize) - , m_blockSizeLog2(BitUtil::FindFirstSetBit(blockSize)) -{ - PDB_ASSERT(BitUtil::IsPowerOfTwo(blockSize), "MSF block size must be a power of two."); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -void PDB::DirectMSFStream::ReadAtOffset(void* destination, size_t size, size_t offset) const PDB_NO_EXCEPT -{ - PDB_ASSERT(destination != nullptr, "Destination buffer not set"); - PDB_ASSERT(offset + size <= m_size, "Not enough data left to read."); - - // work out which block and offset within the block the read offset corresponds to - size_t blockIndex = offset >> m_blockSizeLog2; - const size_t offsetWithinBlock = offset & (m_blockSize - 1u); - - // work out the offset within the data based on the block indices - size_t offsetWithinData = (static_cast(m_blockIndices[blockIndex]) << m_blockSizeLog2) + offsetWithinBlock; - const size_t bytesLeftInBlock = m_blockSize - offsetWithinBlock; - - if (bytesLeftInBlock >= size) - { - // fast path, all the data can be read in one go - const void* const sourceData = Pointer::Offset(m_data, offsetWithinData); - memcpy(destination, sourceData, size); - } - else - { - // slower path, data is scattered across several blocks. - // read remaining bytes in current block first. - { - const void* const sourceData = Pointer::Offset(m_data, offsetWithinData); - memcpy(destination, sourceData, bytesLeftInBlock); - } - - // read remaining bytes from blocks - size_t bytesLeftToRead = size - bytesLeftInBlock; - while (bytesLeftToRead != 0u) - { - // advance to the next block - ++blockIndex; - offsetWithinData = static_cast(m_blockIndices[blockIndex]) << m_blockSizeLog2; - - void* const destinationData = Pointer::Offset(destination, size - bytesLeftToRead); - const void* const sourceData = Pointer::Offset(m_data, offsetWithinData); - - if (bytesLeftToRead > m_blockSize) - { - // copy a whole block at once - memcpy(destinationData, sourceData, m_blockSize); - bytesLeftToRead -= m_blockSize; - } - else - { - // copy remaining bytes - memcpy(destinationData, sourceData, bytesLeftToRead); - bytesLeftToRead -= bytesLeftToRead; - } - } - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::DirectMSFStream::IndexAndOffset PDB::DirectMSFStream::GetBlockIndexForOffset(uint32_t offset) const PDB_NO_EXCEPT -{ - // work out which block and offset within the block the offset corresponds to - const uint32_t blockIndex = offset >> m_blockSizeLog2; - const uint32_t offsetWithinBlock = offset & (m_blockSize - 1u); - - return IndexAndOffset { blockIndex, offsetWithinBlock }; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD size_t PDB::DirectMSFStream::GetDataOffsetForIndexAndOffset(const IndexAndOffset& indexAndOffset) const PDB_NO_EXCEPT -{ - // work out the offset within the data based on the block indices - const size_t offsetWithinData = (static_cast(m_blockIndices[indexAndOffset.index]) << m_blockSizeLog2) + indexAndOffset.offsetWithinBlock; - - return offsetWithinData; -} diff --git a/third_party/raw_pdb/src/PDB_DirectMSFStream.h b/third_party/raw_pdb/src/PDB_DirectMSFStream.h deleted file mode 100644 index 7002459..0000000 --- a/third_party/raw_pdb/src/PDB_DirectMSFStream.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" - - -// https://llvm.org/docs/PDB/index.html#the-msf-container -// https://llvm.org/docs/PDB/MsfFile.html -namespace PDB -{ - // provides direct access to the data of an MSF stream. - // inherently thread-safe, the stream doesn't carry any internal offset or similar. - // trivial to construct. - // slower individual reads, but pays off when not all data of a stream is needed. - class PDB_NO_DISCARD DirectMSFStream - { - public: - DirectMSFStream(void) PDB_NO_EXCEPT; - explicit DirectMSFStream(const void* data, uint32_t blockSize, const uint32_t* blockIndices, uint32_t streamSize) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(DirectMSFStream); - - // Reads a number of bytes from the stream. - void ReadAtOffset(void* destination, size_t size, size_t offset) const PDB_NO_EXCEPT; - - // Reads from the stream. - template - PDB_NO_DISCARD inline T ReadAtOffset(size_t offset) const PDB_NO_EXCEPT - { - T data; - ReadAtOffset(&data, sizeof(T), offset); - return data; - } - - // Returns the block size of the stream. - PDB_NO_DISCARD inline uint32_t GetBlockSize(void) const PDB_NO_EXCEPT - { - return m_blockSize; - } - - // Returns the size of the stream. - PDB_NO_DISCARD inline uint32_t GetSize(void) const PDB_NO_EXCEPT - { - return m_size; - } - - private: - friend class CoalescedMSFStream; - - struct IndexAndOffset - { - uint32_t index; - uint32_t offsetWithinBlock; - }; - - // Returns the block index and offset within the block that correspond to the given offset. - PDB_NO_DISCARD IndexAndOffset GetBlockIndexForOffset(uint32_t offset) const PDB_NO_EXCEPT; - - // Returns the offset into the data that corresponds to the given indices and offset within a block. - PDB_NO_DISCARD size_t GetDataOffsetForIndexAndOffset(const IndexAndOffset& indexAndOffset) const PDB_NO_EXCEPT; - - // Provides read-only access to the memory-mapped data. - PDB_NO_DISCARD inline const void* GetData(void) const PDB_NO_EXCEPT - { - return m_data; - } - - // Provides read-only access to the block indices. - PDB_NO_DISCARD inline const uint32_t* GetBlockIndices(void) const PDB_NO_EXCEPT - { - return m_blockIndices; - } - - const void* m_data; - const uint32_t* m_blockIndices; - uint32_t m_blockSize; - uint32_t m_size; - uint32_t m_blockSizeLog2; - - PDB_DISABLE_COPY(DirectMSFStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_ErrorCodes.h b/third_party/raw_pdb/src/PDB_ErrorCodes.h deleted file mode 100644 index bac0c73..0000000 --- a/third_party/raw_pdb/src/PDB_ErrorCodes.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" - - -namespace PDB -{ - enum class PDB_NO_DISCARD ErrorCode : unsigned int - { - Success = 0u, - - // main PDB validation - InvalidDataSize, - InvalidSuperBlock, - InvalidFreeBlockMap, - - // stream validation - InvalidStream, - InvalidSignature, - InvalidStreamIndex, - UnknownVersion - }; -} diff --git a/third_party/raw_pdb/src/PDB_GlobalSymbolStream.cpp b/third_party/raw_pdb/src/PDB_GlobalSymbolStream.cpp deleted file mode 100644 index 461b869..0000000 --- a/third_party/raw_pdb/src/PDB_GlobalSymbolStream.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_GlobalSymbolStream.h" -#include "PDB_RawFile.h" -#include "PDB_Types.h" -#include "PDB_DBITypes.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::GlobalSymbolStream::GlobalSymbolStream(void) PDB_NO_EXCEPT - : m_stream() - , m_hashRecords(nullptr) - , m_count(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::GlobalSymbolStream::GlobalSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t count) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex)) - , m_hashRecords(m_stream.GetDataAtOffset(sizeof(HashTableHeader))) - , m_count(count) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD const PDB::CodeView::DBI::Record* PDB::GlobalSymbolStream::GetRecord(const CoalescedMSFStream& symbolRecordStream, const HashRecord& hashRecord) const PDB_NO_EXCEPT -{ - // hash record offsets start at 1, not at 0 - const uint32_t headerOffset = hashRecord.offset - 1u; - - // the offset doesn't point to the global symbol directly, but to the CodeView record: - // https://llvm.org/docs/PDB/CodeViewSymbols.html - const CodeView::DBI::Record* record = symbolRecordStream.GetDataAtOffset(headerOffset); - - return record; -} diff --git a/third_party/raw_pdb/src/PDB_GlobalSymbolStream.h b/third_party/raw_pdb/src/PDB_GlobalSymbolStream.h deleted file mode 100644 index cb58777..0000000 --- a/third_party/raw_pdb/src/PDB_GlobalSymbolStream.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - struct HashRecord; - - namespace CodeView - { - namespace DBI - { - struct Record; - } - } - - - class PDB_NO_DISCARD GlobalSymbolStream - { - public: - GlobalSymbolStream(void) PDB_NO_EXCEPT; - explicit GlobalSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t count) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(GlobalSymbolStream); - - // Turns a given hash record into a DBI record using the given symbol stream. - PDB_NO_DISCARD const CodeView::DBI::Record* GetRecord(const CoalescedMSFStream& symbolRecordStream, const HashRecord& hashRecord) const PDB_NO_EXCEPT; - - // Returns a view of all the records in the stream. - PDB_NO_DISCARD inline ArrayView GetRecords(void) const PDB_NO_EXCEPT - { - return ArrayView(m_hashRecords, m_count); - } - - private: - CoalescedMSFStream m_stream; - const HashRecord* m_hashRecords; - uint32_t m_count; - - PDB_DISABLE_COPY(GlobalSymbolStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_IPIStream.cpp b/third_party/raw_pdb/src/PDB_IPIStream.cpp deleted file mode 100644 index dfd21bc..0000000 --- a/third_party/raw_pdb/src/PDB_IPIStream.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_IPIStream.h" -#include "PDB_RawFile.h" -#include "PDB_Util.h" -#include "PDB_DirectMSFStream.h" -#include "PDB_InfoStream.h" -#include "Foundation/PDB_Memory.h" - -namespace -{ - // the IPI stream always resides at index 4 - static constexpr const uint32_t IPIStreamIndex = 4u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::IPIStream::IPIStream(void) PDB_NO_EXCEPT - : m_header() - , m_stream() - , m_records(nullptr) - , m_recordCount(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::IPIStream::IPIStream(IPIStream&& other) PDB_NO_EXCEPT - : m_header(PDB_MOVE(other.m_header)) - , m_stream(PDB_MOVE(other.m_stream)) - , m_records(PDB_MOVE(other.m_records)) - , m_recordCount(PDB_MOVE(other.m_recordCount)) -{ - other.m_records = nullptr; - other.m_recordCount = 0u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::IPIStream& PDB::IPIStream::operator=(IPIStream&& other) PDB_NO_EXCEPT -{ - if (this != &other) - { - PDB_DELETE_ARRAY(m_records); - - m_header = PDB_MOVE(other.m_header); - m_stream = PDB_MOVE(other.m_stream); - m_records = PDB_MOVE(other.m_records); - m_recordCount = PDB_MOVE(other.m_recordCount); - - other.m_records = nullptr; - other.m_recordCount = 0u; - } - - return *this; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::IPIStream::IPIStream(const RawFile& file, const IPI::StreamHeader& header) PDB_NO_EXCEPT - : m_header(header) - , m_stream(file.CreateMSFStream(IPIStreamIndex)) - , m_records(nullptr) - , m_recordCount(GetLastTypeIndex() - GetFirstTypeIndex()) -{ - // types in the IPI stream are accessed by their index from other streams. - // however, the index is not stored with types in the IPI stream directly, but has to be built while walking the stream. - // similarly, because types are variable-length records, there are no direct offsets to access individual types. - // we therefore walk the IPI stream once, and store pointers to the records for trivial O(N) array lookup by index later. - m_records = PDB_NEW_ARRAY(const CodeView::IPI::Record*, m_recordCount); - - // ignore the stream's header - size_t offset = sizeof(IPI::StreamHeader); - - // parse the CodeView records - uint32_t typeIndex = 0u; - while (offset < m_stream.GetSize()) - { - // https://llvm.org/docs/PDB/CodeViewTypes.html - const CodeView::IPI::Record* record = m_stream.GetDataAtOffset(offset); - const uint32_t recordSize = GetCodeViewRecordSize(record); - m_records[typeIndex] = record; - - // position the stream offset at the next record - offset += sizeof(CodeView::IPI::RecordHeader) + recordSize; - - ++typeIndex; - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::IPIStream::~IPIStream(void) PDB_NO_EXCEPT -{ - PDB_DELETE_ARRAY(m_records); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::HasValidIPIStream(const RawFile& file) PDB_NO_EXCEPT -{ - const PDB::InfoStream infoStream(file); - if (!infoStream.HasIPIStream()) - { - return ErrorCode::InvalidStream; - } - - DirectMSFStream stream = file.CreateMSFStream(IPIStreamIndex); - if (stream.GetSize() < sizeof(IPI::StreamHeader)) - { - return ErrorCode::InvalidStream; - } - - const IPI::StreamHeader header = stream.ReadAtOffset(0u); - if (header.version != IPI::StreamHeader::Version::V80) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::IPIStream PDB::CreateIPIStream(const RawFile& file) PDB_NO_EXCEPT -{ - DirectMSFStream stream = file.CreateMSFStream(IPIStreamIndex); - - const IPI::StreamHeader header = stream.ReadAtOffset(0u); - return IPIStream { file, header }; -} diff --git a/third_party/raw_pdb/src/PDB_IPIStream.h b/third_party/raw_pdb/src/PDB_IPIStream.h deleted file mode 100644 index 0efdbe2..0000000 --- a/third_party/raw_pdb/src/PDB_IPIStream.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_ErrorCodes.h" -#include "PDB_IPITypes.h" -#include "PDB_CoalescedMSFStream.h" - - -// PDB IPI stream -// https://llvm.org/docs/PDB/TpiStream.html -namespace PDB -{ - class RawFile; - - - class PDB_NO_DISCARD IPIStream - { - public: - IPIStream(void) PDB_NO_EXCEPT; - IPIStream(IPIStream&& other) PDB_NO_EXCEPT; - IPIStream& operator=(IPIStream&& other) PDB_NO_EXCEPT; - - explicit IPIStream(const RawFile& file, const IPI::StreamHeader& header) PDB_NO_EXCEPT; - ~IPIStream(void) PDB_NO_EXCEPT; - - // Returns the index of the first type, which is not necessarily zero. - PDB_NO_DISCARD inline uint32_t GetFirstTypeIndex(void) const PDB_NO_EXCEPT - { - return m_header.typeIndexBegin; - } - - // Returns the index of the last type. - PDB_NO_DISCARD inline uint32_t GetLastTypeIndex(void) const PDB_NO_EXCEPT - { - return m_header.typeIndexEnd; - } - - // Returns a view of all type records. - // Records identified by a type index can be accessed via "allRecords[typeIndex - firstTypeIndex]". - PDB_NO_DISCARD inline ArrayView GetTypeRecords(void) const PDB_NO_EXCEPT - { - return ArrayView(m_records, m_recordCount); - } - - private: - IPI::StreamHeader m_header; - CoalescedMSFStream m_stream; - const CodeView::IPI::Record** m_records; - size_t m_recordCount; - - PDB_DISABLE_COPY(IPIStream); - }; - - - // ------------------------------------------------------------------------------------------------ - // General - // ------------------------------------------------------------------------------------------------ - - PDB_NO_DISCARD ErrorCode HasValidIPIStream(const RawFile& file) PDB_NO_EXCEPT; - - PDB_NO_DISCARD IPIStream CreateIPIStream(const RawFile& file) PDB_NO_EXCEPT; -} diff --git a/third_party/raw_pdb/src/PDB_IPITypes.h b/third_party/raw_pdb/src/PDB_IPITypes.h deleted file mode 100644 index c9c4e08..0000000 --- a/third_party/raw_pdb/src/PDB_IPITypes.h +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" - - -namespace PDB -{ - namespace IPI - { - // https://llvm.org/docs/PDB/TpiStream.html#tpi-header - struct StreamHeader - { - enum class PDB_NO_DISCARD Version : uint32_t - { - V40 = 19950410u, - V41 = 19951122u, - V50 = 19961031u, - V70 = 19990903u, - V80 = 20040203u - }; - - Version version; - uint32_t headerSize; - uint32_t typeIndexBegin; - uint32_t typeIndexEnd; - uint32_t typeRecordBytes; - uint16_t hashStreamIndex; - uint16_t hashAuxStreamIndex; - uint32_t hashKeySize; - uint32_t hashBucketCount; - uint32_t hashValueBufferOffset; - uint32_t hashValueBufferLength; - uint32_t indexOffsetBufferOffset; - uint32_t indexOffsetBufferLength; - uint32_t hashAdjBufferOffset; - uint32_t hashAdjBufferLength; - }; - } - - - namespace CodeView - { - namespace IPI - { - // code view type records that can appear in an IPI stream - // https://llvm.org/docs/PDB/CodeViewTypes.html - // https://llvm.org/docs/PDB/TpiStream.html#tpi-vs-ipi-stream - enum class PDB_NO_DISCARD TypeRecordKind : uint16_t - { - LF_FUNC_ID = 0x1601u, // global function ID - LF_MFUNC_ID = 0x1602u, // member function ID - LF_BUILDINFO = 0x1603u, // build information - LF_SUBSTR_LIST = 0x1604u, // similar to LF_ARGLIST for a list of substrings - LF_STRING_ID = 0x1605u, // string ID - LF_UDT_SRC_LINE = 0x1606u, // source and line on where an UDT (User Defined Type) is defined, generated by the compiler - LF_UDT_MOD_SRC_LINE = 0x1607u // module, source and line on where an UDT is defined, generated by the linker - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1715 - enum class PDB_NO_DISCARD BuildInfoType : uint8_t - { - CurrentDirectory, // compiler working directory - BuildTool, // tool path - SourceFile, // path to source file, relative or absolute - TypeServerPDB, // path to PDB file - CommandLine // command-line used to build the source file - }; - - struct RecordHeader - { - uint16_t size; // record length, not including this 2-byte field - TypeRecordKind kind; // record kind - }; - - // all CodeView records are stored as a header, followed by variable-length data. - // internal Record structs such as S_PUB32, S_GDATA32, etc. correspond to the data layout of a CodeView record of that kind. - struct Record - { - RecordHeader header; - union Data - { -#pragma pack(push, 1) - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1680 - struct - { - uint32_t scopeId; // parent scope of the ID, 0 if global - uint32_t typeIndex; // function type - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } LF_FUNC_ID; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1687 - struct - { - uint32_t parentTypeIndex; // parent scope of the ID, 0 if global - uint32_t typeIndex; // function type - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } LF_MFUNC_ID; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1694 - struct - { - uint32_t id; // ID to list of sub-string IDs - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } LF_STRING_ID; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1700 - struct - { - uint32_t typeIndex; // UDT's type index - uint32_t stringIndex; // index to LF_STRING_ID record where source file name is saved - uint32_t line; // line number - } LF_UDT_SRC_LINE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1707 - struct - { - uint32_t typeIndex; // UDT's type index - uint32_t stringIndex; // index into '/names' string table where source file name is saved - uint32_t line; // line number - uint16_t moduleIndex; // module that contributes this UDT definition - } LF_UDT_MOD_SRC_LINE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2043 - struct - { - uint32_t count; - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, typeIndices); - } LF_SUBSTR_LIST; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1726 - struct - { - uint16_t count; - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, typeIndices); - } LF_BUILDINFO; -#pragma pack(pop) - } data; - }; - } - } -} diff --git a/third_party/raw_pdb/src/PDB_ImageSectionStream.cpp b/third_party/raw_pdb/src/PDB_ImageSectionStream.cpp deleted file mode 100644 index 3d495ad..0000000 --- a/third_party/raw_pdb/src/PDB_ImageSectionStream.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_ImageSectionStream.h" -#include "PDB_RawFile.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ImageSectionStream::ImageSectionStream(void) PDB_NO_EXCEPT - : m_stream() - , m_headers(nullptr) - , m_count(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ImageSectionStream::ImageSectionStream(const RawFile& file, uint16_t streamIndex) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex)) - , m_headers(m_stream.GetDataAtOffset(0u)) - , m_count(m_stream.GetSize() / sizeof(IMAGE_SECTION_HEADER)) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD uint32_t PDB::ImageSectionStream::ConvertSectionOffsetToRVA(uint16_t oneBasedSectionIndex, uint32_t offsetInSection) const PDB_NO_EXCEPT -{ - if (oneBasedSectionIndex == 0u) - { - // should never happen, but prevent underflow - return 0u; - } - else if (oneBasedSectionIndex > m_count) - { - // this symbol is "contained" in a section that is neither part of the PDB, nor the EXE. - // it is a special compiler-generated or linker-generated symbol such as CFG symbols (e.g. __guard_fids_count, __guard_flags). - // we can safely ignore those symbols. - return 0u; - } - - return m_headers[oneBasedSectionIndex - 1u].VirtualAddress + offsetInSection; -} diff --git a/third_party/raw_pdb/src/PDB_ImageSectionStream.h b/third_party/raw_pdb/src/PDB_ImageSectionStream.h deleted file mode 100644 index 190c722..0000000 --- a/third_party/raw_pdb/src/PDB_ImageSectionStream.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_Types.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - struct IMAGE_SECTION_HEADER; - - - class PDB_NO_DISCARD ImageSectionStream - { - public: - ImageSectionStream(void) PDB_NO_EXCEPT; - explicit ImageSectionStream(const RawFile& file, uint16_t streamIndex) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(ImageSectionStream); - - // Converts a one-based section offset into an RVA. - PDB_NO_DISCARD uint32_t ConvertSectionOffsetToRVA(uint16_t oneBasedSectionIndex, uint32_t offsetInSection) const PDB_NO_EXCEPT; - - // Returns a view of all the sections in the stream. - PDB_NO_DISCARD inline ArrayView GetImageSections(void) const PDB_NO_EXCEPT - { - return ArrayView(m_headers, m_count); - } - - private: - CoalescedMSFStream m_stream; - const IMAGE_SECTION_HEADER* m_headers; - size_t m_count; - - PDB_DISABLE_COPY(ImageSectionStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_InfoStream.cpp b/third_party/raw_pdb/src/PDB_InfoStream.cpp deleted file mode 100644 index fa16600..0000000 --- a/third_party/raw_pdb/src/PDB_InfoStream.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_InfoStream.h" -#include "PDB_RawFile.h" -#include "Foundation/PDB_CRT.h" - -namespace -{ - // the PDB info stream always resides at index 1 - static constexpr const uint32_t InfoStreamIndex = 1u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::InfoStream::InfoStream(void) PDB_NO_EXCEPT - : m_stream() - , m_header(nullptr) - , m_namesStreamIndex(0) - , m_usesDebugFastlink(false) - , m_hasIPIStream(false) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::InfoStream::InfoStream(const RawFile& file) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(InfoStreamIndex)) - , m_header(m_stream.GetDataAtOffset(0u)) - , m_namesStreamIndex(0) - , m_usesDebugFastlink(false) - , m_hasIPIStream(false) -{ - // the info stream starts with the header, followed by the named stream map, followed by the feature codes - // https://llvm.org/docs/PDB/PdbStream.html#named-stream-map - size_t streamOffset = sizeof(Header); - - const NamedStreamMap* namedStreamMap = m_stream.GetDataAtOffset(streamOffset); - streamOffset += sizeof(NamedStreamMap) + namedStreamMap->length; - - const SerializedHashTable::Header* hashTableHeader = m_stream.GetDataAtOffset(streamOffset); - streamOffset += sizeof(SerializedHashTable::Header); - - const SerializedHashTable::BitVector* presentBitVector = m_stream.GetDataAtOffset(streamOffset); - streamOffset += sizeof(SerializedHashTable::BitVector) + sizeof(uint32_t) * presentBitVector->wordCount; - - const SerializedHashTable::BitVector* deletedBitVector = m_stream.GetDataAtOffset(streamOffset); - streamOffset += sizeof(SerializedHashTable::BitVector) + sizeof(uint32_t) * deletedBitVector->wordCount; - - // the hash table entries can be used to identify the indices of certain common streams like: - // "/UDTSRCLINEUNDONE" - // "/src/headerblock" - // "/LinkInfo" - // "/TMCache" - // "/names" - - const NamedStreamMap::HashTableEntry* namedStreamMapHashEntries = m_stream.GetDataAtOffset(streamOffset); - - // Find "/names" stream, used to look up filenames for lines. - for (uint32_t i = 0, size = hashTableHeader->size; i < size; ++i) - { - const NamedStreamMap::HashTableEntry& entry = namedStreamMapHashEntries[i]; - const char* streamName = &namedStreamMap->stringTable[entry.stringTableOffset]; - - if (strcmp("/names", streamName) == 0) - { - m_namesStreamIndex = entry.streamIndex; - } - } - - streamOffset += sizeof(NamedStreamMap::HashTableEntry) * hashTableHeader->size; - - // read feature codes by consuming remaining bytes - // https://llvm.org/docs/PDB/PdbStream.html#pdb-feature-codes - const FeatureCode* featureCodes = m_stream.GetDataAtOffset(streamOffset); - const size_t remainingBytes = m_stream.GetSize() - streamOffset; - const size_t count = remainingBytes / sizeof(FeatureCode); - - for (size_t i=0u; i < count; ++i) - { - FeatureCode code = featureCodes[i]; - if (code == PDB::FeatureCode::MinimalDebugInfo) - { - m_usesDebugFastlink = true; - } - else if (code == PDB::FeatureCode::VC110 || code == PDB::FeatureCode::VC140) - { - m_hasIPIStream = true; - } - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::NamesStream PDB::InfoStream::CreateNamesStream(const RawFile& file) const PDB_NO_EXCEPT -{ - return NamesStream(file, m_namesStreamIndex); -} diff --git a/third_party/raw_pdb/src/PDB_InfoStream.h b/third_party/raw_pdb/src/PDB_InfoStream.h deleted file mode 100644 index 9e15ebc..0000000 --- a/third_party/raw_pdb/src/PDB_InfoStream.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "PDB_Types.h" -#include "PDB_CoalescedMSFStream.h" -#include "PDB_NamesStream.h" - -namespace PDB -{ - class RawFile; - - - // PDB Info Stream - // https://llvm.org/docs/PDB/PdbStream.html - class PDB_NO_DISCARD InfoStream - { - public: - InfoStream(void) PDB_NO_EXCEPT; - explicit InfoStream(const RawFile& file) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(InfoStream); - - // Returns the header of the stream. - PDB_NO_DISCARD inline const Header* GetHeader(void) const PDB_NO_EXCEPT - { - return m_header; - } - - // Returns whether the module has a names stream. - PDB_NO_DISCARD inline bool HasNamesStream(void) const PDB_NO_EXCEPT - { - return (m_namesStreamIndex != 0u); - } - - // Returns whether the PDB file was linked using /DEBUG:FASTLINK. - PDB_NO_DISCARD inline bool UsesDebugFastLink(void) const PDB_NO_EXCEPT - { - return m_usesDebugFastlink; - } - - // Returns whether the PDB file has an IPI stream. - PDB_NO_DISCARD inline bool HasIPIStream(void) const PDB_NO_EXCEPT - { - return m_hasIPIStream; - } - - // Create names stream - PDB_NO_DISCARD NamesStream CreateNamesStream(const RawFile& file) const PDB_NO_EXCEPT; - - private: - CoalescedMSFStream m_stream; - const Header* m_header; - uint32_t m_namesStreamIndex; - bool m_usesDebugFastlink; - bool m_hasIPIStream; - - PDB_DISABLE_COPY(InfoStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleInfoStream.cpp b/third_party/raw_pdb/src/PDB_ModuleInfoStream.cpp deleted file mode 100644 index 86040ff..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleInfoStream.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_ModuleInfoStream.h" -#include "Foundation/PDB_Memory.h" -#include "Foundation/PDB_CRT.h" - -namespace -{ - static constexpr const char* LinkerSymbolName("* Linker *"); - - - // ------------------------------------------------------------------------------------------------ - // ------------------------------------------------------------------------------------------------ - PDB_NO_DISCARD static inline size_t EstimateModuleCount(size_t streamSize) PDB_NO_EXCEPT - { - // work out how many modules are stored in the stream at most. - // the module info is stored in variable-length records, so we can't determine the exact number without walking the stream. - return streamSize / sizeof(PDB::DBI::ModuleInfo); - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::Module::Module(void) PDB_NO_EXCEPT - : m_info(nullptr) - , m_name(nullptr) - , m_nameLength(0u) - , m_objectName(nullptr) - , m_objectNameLength(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::Module::Module(const DBI::ModuleInfo* info, const char* name, size_t nameLength, const char* objectName, size_t objectNameLength) PDB_NO_EXCEPT - : m_info(info) - , m_name(name) - , m_nameLength(nameLength) - , m_objectName(objectName) - , m_objectNameLength(objectNameLength) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD bool PDB::ModuleInfoStream::Module::HasSymbolStream(void) const PDB_NO_EXCEPT -{ - const uint16_t streamIndex = m_info->moduleSymbolStreamIndex; - - // some modules don't have a symbol stream, i.e. no additional debug information is present. - // this usually happens when private symbols are stripped from a PDB. - return (streamIndex != 0xFFFFu); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD bool PDB::ModuleInfoStream::Module::HasLineStream(void) const PDB_NO_EXCEPT -{ - return (m_info->c13Size > 0); -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ModuleSymbolStream PDB::ModuleInfoStream::Module::CreateSymbolStream(const RawFile& file) const PDB_NO_EXCEPT -{ - PDB_ASSERT(HasSymbolStream(), "Module symbol stream index is invalid."); - - return ModuleSymbolStream(file, m_info->moduleSymbolStreamIndex, m_info->symbolSize); -} - -PDB_NO_DISCARD PDB::ModuleLineStream PDB::ModuleInfoStream::Module::CreateLineStream(const RawFile& file) const PDB_NO_EXCEPT -{ - PDB_ASSERT(HasLineStream(), "Module line stream is not present."); - - return ModuleLineStream(file, m_info->moduleSymbolStreamIndex, m_info->symbolSize + m_info->c11Size + m_info->c13Size, m_info->symbolSize + m_info->c11Size); -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::ModuleInfoStream(void) PDB_NO_EXCEPT - : m_stream() - , m_modules(nullptr) - , m_moduleCount(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::ModuleInfoStream(ModuleInfoStream&& other) PDB_NO_EXCEPT - : m_stream(PDB_MOVE(other.m_stream)) - , m_modules(PDB_MOVE(other.m_modules)) - , m_moduleCount(PDB_MOVE(other.m_moduleCount)) -{ - other.m_modules = nullptr; - other.m_moduleCount = 0u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream& PDB::ModuleInfoStream::operator=(ModuleInfoStream&& other) PDB_NO_EXCEPT -{ - if (this != &other) - { - PDB_DELETE_ARRAY(m_modules); - - m_stream = PDB_MOVE(other.m_stream); - m_modules = PDB_MOVE(other.m_modules); - m_moduleCount = PDB_MOVE(other.m_moduleCount); - - other.m_modules = nullptr; - other.m_moduleCount = 0u; - } - - return *this; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::ModuleInfoStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT - : m_stream(directStream, size, offset) - , m_modules(nullptr) - , m_moduleCount(0u) -{ - m_modules = PDB_NEW_ARRAY(Module, EstimateModuleCount(size)); - - size_t streamOffset = 0u; - while (streamOffset < size) - { - const DBI::ModuleInfo* moduleInfo = m_stream.GetDataAtOffset(streamOffset); - streamOffset += sizeof(DBI::ModuleInfo); - - const char* name = m_stream.GetDataAtOffset(streamOffset); - const size_t nameLength = strlen(name); - streamOffset += nameLength + 1u; - - const char* objectName = m_stream.GetDataAtOffset(streamOffset); - const size_t objectNameLength = strlen(objectName); - streamOffset += objectNameLength + 1u; - - // the stream is aligned to 4 bytes - streamOffset = BitUtil::RoundUpToMultiple(streamOffset, 4ul); - - m_modules[m_moduleCount] = Module(moduleInfo, name, nameLength, objectName, objectNameLength); - ++m_moduleCount; - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleInfoStream::~ModuleInfoStream(void) PDB_NO_EXCEPT -{ - PDB_DELETE_ARRAY(m_modules); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD const PDB::ModuleInfoStream::Module* PDB::ModuleInfoStream::FindLinkerModule(void) const PDB_NO_EXCEPT -{ - const size_t count = m_moduleCount; - for (size_t i = 0u; i < count; ++i) - { - // with both MSVC cl.exe and Clang, the linker symbol is the last one to be stored, so start searching from the end - const Module& module = m_modules[count - i - 1u]; - - // check if this is the linker symbol - if (strcmp(module.GetName().Decay(), LinkerSymbolName) == 0) - { - return &module; - } - } - - return nullptr; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleInfoStream.h b/third_party/raw_pdb/src/PDB_ModuleInfoStream.h deleted file mode 100644 index 4fef0fe..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleInfoStream.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_CoalescedMSFStream.h" -#include "PDB_ModuleSymbolStream.h" -#include "PDB_ModuleLineStream.h" - -namespace PDB -{ - class PDB_NO_DISCARD DirectMSFStream; - - class PDB_NO_DISCARD ModuleInfoStream - { - public: - class PDB_NO_DISCARD Module - { - public: - Module(void) PDB_NO_EXCEPT; - explicit Module(const DBI::ModuleInfo* info, const char* name, size_t nameLength, const char* objectName, size_t objectNameLength) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(Module); - - // Returns whether the module has a symbol stream. - PDB_NO_DISCARD bool HasSymbolStream(void) const PDB_NO_EXCEPT; - - // Returns whether the module has a line stream. - PDB_NO_DISCARD bool HasLineStream(void) const PDB_NO_EXCEPT; - - // Creates a symbol stream for the module. - PDB_NO_DISCARD ModuleSymbolStream CreateSymbolStream(const RawFile& file) const PDB_NO_EXCEPT; - - // Create a line stream for the module - PDB_NO_DISCARD ModuleLineStream CreateLineStream(const RawFile& file) const PDB_NO_EXCEPT; - - - // Returns the PDB module info. - PDB_NO_DISCARD inline const DBI::ModuleInfo* GetInfo(void) const PDB_NO_EXCEPT - { - return m_info; - } - - // Returns the name of the module. - PDB_NO_DISCARD inline ArrayView GetName(void) const PDB_NO_EXCEPT - { - return ArrayView(m_name, m_nameLength); - } - - // Returns the name of the object file of the module. - PDB_NO_DISCARD inline ArrayView GetObjectName(void) const PDB_NO_EXCEPT - { - return ArrayView(m_objectName, m_objectNameLength); - } - - private: - // the module info is stored in variable-length arrays inside the stream, so rather than store an array directly, - // we need to store pointers to the individual data items inside the stream. - const DBI::ModuleInfo* m_info; - - // the module name, e.g. the path to an object file or import library such as "Import:kernel32.dll" - const char* m_name; - size_t m_nameLength; - - // the name of the object file. either the same as the module name, or the path to the archive that contained the module - const char* m_objectName; - size_t m_objectNameLength; - - PDB_DISABLE_COPY(Module); - }; - - ModuleInfoStream(void) PDB_NO_EXCEPT; - ModuleInfoStream(ModuleInfoStream&& other) PDB_NO_EXCEPT; - ModuleInfoStream& operator=(ModuleInfoStream&& other) PDB_NO_EXCEPT; - - explicit ModuleInfoStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT; - - ~ModuleInfoStream(void) PDB_NO_EXCEPT; - - // Tries to find the linker module corresponding to the linker, i.e. the module named "* Linker *". - PDB_NO_DISCARD const Module* FindLinkerModule(void) const PDB_NO_EXCEPT; - - // Returns the module with the given index. - PDB_NO_DISCARD inline const Module& GetModule(uint32_t index) const PDB_NO_EXCEPT - { - return m_modules[index]; - } - - // Returns a view of all modules in the info stream. - PDB_NO_DISCARD inline ArrayView GetModules(void) const PDB_NO_EXCEPT - { - return ArrayView(m_modules, m_moduleCount); - } - - private: - CoalescedMSFStream m_stream; - Module* m_modules; - size_t m_moduleCount; - - PDB_DISABLE_COPY(ModuleInfoStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleLineStream.cpp b/third_party/raw_pdb/src/PDB_ModuleLineStream.cpp deleted file mode 100644 index 201983e..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleLineStream.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_ModuleLineStream.h" -#include "PDB_RawFile.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleLineStream::ModuleLineStream(void) PDB_NO_EXCEPT - : m_stream(), m_c13LineInfoOffset(0) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleLineStream::ModuleLineStream(const RawFile& file, uint16_t streamIndex, uint32_t streamSize, size_t c13LineInfoOffset) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex, streamSize)), m_c13LineInfoOffset(c13LineInfoOffset) -{ - // https://llvm.org/docs/PDB/ModiStream.html - // struct ModiStream { - // uint32_t Signature; - // uint8_t Symbols[SymbolSize - 4]; - // uint8_t C11LineInfo[C11Size]; - // uint8_t C13LineInfo[C13Size]; - // uint32_t GlobalRefsSize; - // uint8_t GlobalRefs[GlobalRefsSize]; - // }; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleLineStream.h b/third_party/raw_pdb/src/PDB_ModuleLineStream.h deleted file mode 100644 index d1148cc..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleLineStream.h +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_BitUtil.h" -#include "PDB_DBITypes.h" -#include "PDB_Util.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - - class PDB_NO_DISCARD ModuleLineStream - { - public: - ModuleLineStream(void) PDB_NO_EXCEPT; - explicit ModuleLineStream(const RawFile& file, uint16_t streamIndex, uint32_t streamSize, size_t c13LineInfoOffset) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(ModuleLineStream); - - template - void ForEachSection(F&& functor) const PDB_NO_EXCEPT - { - size_t offset = m_c13LineInfoOffset; - - // read the line stream sections - while (offset < m_stream.GetSize()) - { - const CodeView::DBI::LineSection* section = m_stream.GetDataAtOffset(offset); - - functor(section); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + section->header.size, 4u); - } - } - - template - void ForEachLinesBlock(const CodeView::DBI::LineSection* section, F&& functor) const PDB_NO_EXCEPT - { - PDB_ASSERT(section->header.kind == CodeView::DBI::DebugSubsectionKind::S_LINES, - "DebugSubsectionHeader::Kind %X != S_LINES (%X)", - static_cast(section->header.kind), static_cast(CodeView::DBI::DebugSubsectionKind::S_LINES)); - - size_t offset = m_stream.GetPointerOffset(section); - const size_t headerEnd = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + section->header.size, 4u); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + sizeof(CodeView::DBI::LinesHeader), 4u); - - // read all blocks of lines - while (offset < headerEnd) - { - const CodeView::DBI::LinesFileBlockHeader* linesBlockHeader = m_stream.GetDataAtOffset(offset); - const CodeView::DBI::Line* blockLines = m_stream.GetDataAtOffset(offset + sizeof(CodeView::DBI::LinesFileBlockHeader)); - - const size_t blockColumnsOffset = sizeof(CodeView::DBI::LinesFileBlockHeader) + (linesBlockHeader->numLines * (sizeof(CodeView::DBI::Line))); - const CodeView::DBI::Column* blockColumns = blockColumnsOffset < linesBlockHeader->size ? m_stream.GetDataAtOffset(offset) : nullptr; - - functor(linesBlockHeader, blockLines, blockColumns); - - offset = BitUtil::RoundUpToMultiple(offset + linesBlockHeader->size, 4u); - } - - PDB_ASSERT(offset == headerEnd, "Mismatch between offset %zu and header end %zu when reading lines blocks", offset, headerEnd); - } - - template - void ForEachFileChecksum(const CodeView::DBI::LineSection* section, F&& functor) const PDB_NO_EXCEPT - { - PDB_ASSERT(section->header.kind == CodeView::DBI::DebugSubsectionKind::S_FILECHECKSUMS, - "DebugSubsectionHeader::Kind %X != S_FILECHECKSUMS (%X)", - static_cast(section->header.kind), static_cast(CodeView::DBI::DebugSubsectionKind::S_FILECHECKSUMS)); - - size_t offset = m_stream.GetPointerOffset(section); - const size_t headerEnd = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + section->header.size, 4u); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader), 4u); - - // read all file checksums - while (offset < headerEnd) - { - const CodeView::DBI::FileChecksumHeader* fileChecksumHeader = m_stream.GetDataAtOffset(offset); - - functor(fileChecksumHeader); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::FileChecksumHeader) + fileChecksumHeader->checksumSize, 4u); - } - - PDB_ASSERT(offset == headerEnd, "Mismatch between offset %zu and header end %zu when reading file checksums", offset, headerEnd); - } - - template - void ForEachInlineeSourceLine(const CodeView::DBI::LineSection* section, F&& functor) const PDB_NO_EXCEPT - { - PDB_ASSERT(section->header.kind == CodeView::DBI::DebugSubsectionKind::S_INLINEELINES, - "DebugSubsectionHeader::Kind %X != S_INLINEELINES (%X)", - static_cast(section->header.kind), static_cast(CodeView::DBI::DebugSubsectionKind::S_INLINEELINES)); - - PDB_ASSERT(section->inlineeHeader.kind == CodeView::DBI::InlineeSourceLineKind::Signature, - "InlineeSourceLineKind %X != :InlineeSourceLineKind::Signature (%X)", static_cast(section->header.kind), static_cast(CodeView::DBI::InlineeSourceLineKind::Signature)); - - size_t offset = m_stream.GetPointerOffset(section); - const size_t headerEnd = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + section->header.size, 4u); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + sizeof(CodeView::DBI::InlineeSourceLineHeader), 4u); - - // read all file checksums - while (offset < headerEnd) - { - const CodeView::DBI::InlineeSourceLine* inlineeSourceLine = m_stream.GetDataAtOffset(offset); - - functor(inlineeSourceLine); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::InlineeSourceLine), 4u); - } - } - - template - void ForEachInlineeSourceLineEx(const CodeView::DBI::LineSection* section, F&& functor) const PDB_NO_EXCEPT - { - PDB_ASSERT(section->header.kind == CodeView::DBI::DebugSubsectionKind::S_INLINEELINES, - "DebugSubsectionHeader::Kind %X != S_INLINEELINES (%X)", static_cast(section->header.kind), static_cast(CodeView::DBI::DebugSubsectionKind::S_INLINEELINES)); - - PDB_ASSERT(section->inlineeHeader.kind == CodeView::DBI::InlineeSourceLineKind::SignatureEx, - "InlineeSourceLineKind %X != :InlineeSourceLineKind::SignatureEx (%X)", static_cast(section->header.kind), static_cast(CodeView::DBI::InlineeSourceLineKind::SignatureEx)); - - size_t offset = m_stream.GetPointerOffset(section); - const size_t headerEnd = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + section->header.size, 4u); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::DebugSubsectionHeader) + sizeof(CodeView::DBI::InlineeSourceLineHeader), 4u); - - // read all file checksums - while (offset < headerEnd) - { - const CodeView::DBI::InlineeSourceLineEx* inlineeSourceLineEx = m_stream.GetDataAtOffset(offset); - - functor(inlineeSourceLineEx); - - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::InlineeSourceLineEx) + (inlineeSourceLineEx->extraLines * sizeof(uint32_t)), 4u); - } - } - private: - CoalescedMSFStream m_stream; - size_t m_c13LineInfoOffset; - - PDB_DISABLE_COPY(ModuleLineStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleSymbolStream.cpp b/third_party/raw_pdb/src/PDB_ModuleSymbolStream.cpp deleted file mode 100644 index ae10a11..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleSymbolStream.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_ModuleSymbolStream.h" -#include "PDB_RawFile.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleSymbolStream::ModuleSymbolStream(void) PDB_NO_EXCEPT - : m_stream() -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::ModuleSymbolStream::ModuleSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t symbolStreamSize) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex, symbolStreamSize)) -{ - // https://llvm.org/docs/PDB/ModiStream.html - // struct ModiStream { - // uint32_t Signature; - // uint8_t Symbols[SymbolSize - 4]; - // uint8_t C11LineInfo[C11Size]; - // uint8_t C13LineInfo[C13Size]; - // uint32_t GlobalRefsSize; - // uint8_t GlobalRefs[GlobalRefsSize]; - // }; - // we are only interested in the symbols, but not the line information or global refs. - // the coalesced stream is therefore only built for the symbols, not all the data in the stream. - // this potentially saves a lot of memory and performance on large PDBs. -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD const PDB::CodeView::DBI::Record* PDB::ModuleSymbolStream::FindRecord(CodeView::DBI::SymbolRecordKind kind) const PDB_NO_EXCEPT -{ - // ignore the stream's 4-byte signature - size_t offset = sizeof(uint32_t); - - // parse the CodeView records - while (offset < m_stream.GetSize()) - { - // https://llvm.org/docs/PDB/CodeViewTypes.html - const CodeView::DBI::Record* record = m_stream.GetDataAtOffset(offset); - if (record->header.kind == kind) - { - return record; - } - - const uint32_t recordSize = GetCodeViewRecordSize(record); - - // position the module stream offset at the next record - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::RecordHeader) + recordSize, 4u); - } - - return nullptr; -} diff --git a/third_party/raw_pdb/src/PDB_ModuleSymbolStream.h b/third_party/raw_pdb/src/PDB_ModuleSymbolStream.h deleted file mode 100644 index 2138708..0000000 --- a/third_party/raw_pdb/src/PDB_ModuleSymbolStream.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_BitUtil.h" -#include "PDB_DBITypes.h" -#include "PDB_Util.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - - - class PDB_NO_DISCARD ModuleSymbolStream - { - public: - ModuleSymbolStream(void) PDB_NO_EXCEPT; - explicit ModuleSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t symbolStreamSize) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(ModuleSymbolStream); - - // Returns a record's parent record. - template - PDB_NO_DISCARD inline const CodeView::DBI::Record* GetParentRecord(const T& record) const PDB_NO_EXCEPT - { - return m_stream.GetDataAtOffset(record.parent); - } - - // Returns a record's end record. - template - PDB_NO_DISCARD inline const CodeView::DBI::Record* GetEndRecord(const T& record) const PDB_NO_EXCEPT - { - return m_stream.GetDataAtOffset(record.end); - } - - // Finds a record of a certain kind. - PDB_NO_DISCARD const CodeView::DBI::Record* FindRecord(CodeView::DBI::SymbolRecordKind Kind) const PDB_NO_EXCEPT; - - - // Iterates all records in the stream. - template - void ForEachSymbol(F&& functor) const PDB_NO_EXCEPT - { - // ignore the stream's 4-byte signature - size_t offset = sizeof(uint32_t); - - // parse the CodeView records - while (offset < m_stream.GetSize()) - { - // https://llvm.org/docs/PDB/CodeViewTypes.html - const CodeView::DBI::Record* record = m_stream.GetDataAtOffset(offset); - const uint32_t recordSize = GetCodeViewRecordSize(record); - - functor(record); - - // position the module stream offset at the next record - offset = BitUtil::RoundUpToMultiple(offset + sizeof(CodeView::DBI::RecordHeader) + recordSize, 4u); - } - } - - private: - CoalescedMSFStream m_stream; - - PDB_DISABLE_COPY(ModuleSymbolStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_NamesStream.cpp b/third_party/raw_pdb/src/PDB_NamesStream.cpp deleted file mode 100644 index fae895e..0000000 --- a/third_party/raw_pdb/src/PDB_NamesStream.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_NamesStream.h" -#include "PDB_RawFile.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::NamesStream::NamesStream(void) PDB_NO_EXCEPT - : m_stream() - , m_header(nullptr) - , m_stringTable(nullptr) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::NamesStream::NamesStream(const RawFile& file, uint32_t streamIndex) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex)) - , m_header(m_stream.GetDataAtOffset(0u)) - , m_stringTable(nullptr) -{ - // grab a pointer into the string table - m_stringTable = m_stream.GetDataAtOffset(sizeof(NamesHeader)); -} diff --git a/third_party/raw_pdb/src/PDB_NamesStream.h b/third_party/raw_pdb/src/PDB_NamesStream.h deleted file mode 100644 index c305242..0000000 --- a/third_party/raw_pdb/src/PDB_NamesStream.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "PDB_Types.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - - struct NamesHeader - { - uint32_t magic; - uint32_t hashVersion; - uint32_t size; - }; - - class PDB_NO_DISCARD NamesStream - { - public: - NamesStream(void) PDB_NO_EXCEPT; - explicit NamesStream(const RawFile& file, uint32_t streamIndex) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(NamesStream); - - // Returns the header of the stream. - PDB_NO_DISCARD inline const NamesHeader* GetHeader(void) const PDB_NO_EXCEPT - { - return m_header; - } - - PDB_NO_DISCARD inline const char* GetFilename(uint32_t filenameOffset) const PDB_NO_EXCEPT - { - return m_stringTable + filenameOffset; - } - - private: - CoalescedMSFStream m_stream; - const NamesHeader* m_header; - const char* m_stringTable; - - PDB_DISABLE_COPY(NamesStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_PCH.cpp b/third_party/raw_pdb/src/PDB_PCH.cpp deleted file mode 100644 index 70ca8d6..0000000 --- a/third_party/raw_pdb/src/PDB_PCH.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" diff --git a/third_party/raw_pdb/src/PDB_PCH.h b/third_party/raw_pdb/src/PDB_PCH.h deleted file mode 100644 index 8374e10..0000000 --- a/third_party/raw_pdb/src/PDB_PCH.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -// this needs to be the first include, since it determines the platform/toolchain we're compiling for -#include "Foundation/PDB_Platform.h" -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_Warnings.h" - -// library includes -#include "Foundation/PDB_Log.h" -#include "Foundation/PDB_Assert.h" -#include "Foundation/PDB_Move.h" -#include "Foundation/PDB_Forward.h" -#include "Foundation/PDB_Memory.h" -#include "Foundation/PDB_ArrayView.h" -#include "Foundation/PDB_BitUtil.h" -#include "Foundation/PDB_BitOperators.h" -#include "Foundation/PDB_PointerUtil.h" diff --git a/third_party/raw_pdb/src/PDB_PublicSymbolStream.cpp b/third_party/raw_pdb/src/PDB_PublicSymbolStream.cpp deleted file mode 100644 index 5efad22..0000000 --- a/third_party/raw_pdb/src/PDB_PublicSymbolStream.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_PublicSymbolStream.h" -#include "PDB_RawFile.h" -#include "PDB_Types.h" -#include "PDB_DBITypes.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::PublicSymbolStream::PublicSymbolStream(void) PDB_NO_EXCEPT - : m_stream() - , m_hashRecords(nullptr) - , m_count(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::PublicSymbolStream::PublicSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t count) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(streamIndex)) - , m_hashRecords(m_stream.GetDataAtOffset(sizeof(PublicStreamHeader) + sizeof(HashTableHeader))) - , m_count(count) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD const PDB::CodeView::DBI::Record* PDB::PublicSymbolStream::GetRecord(const CoalescedMSFStream& symbolRecordStream, const HashRecord& hashRecord) const PDB_NO_EXCEPT -{ - // hash record offsets start at 1, not at 0 - const uint32_t headerOffset = hashRecord.offset - 1u; - - // the offset doesn't point to the public symbol directly, but to the CodeView record: - // https://llvm.org/docs/PDB/CodeViewSymbols.html - const CodeView::DBI::Record* record = symbolRecordStream.GetDataAtOffset(headerOffset); - - return record; -} diff --git a/third_party/raw_pdb/src/PDB_PublicSymbolStream.h b/third_party/raw_pdb/src/PDB_PublicSymbolStream.h deleted file mode 100644 index 681a613..0000000 --- a/third_party/raw_pdb/src/PDB_PublicSymbolStream.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class RawFile; - struct HashRecord; - - namespace CodeView - { - namespace DBI - { - struct Record; - } - } - - - class PDB_NO_DISCARD PublicSymbolStream - { - public: - PublicSymbolStream(void) PDB_NO_EXCEPT; - explicit PublicSymbolStream(const RawFile& file, uint16_t streamIndex, uint32_t count) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(PublicSymbolStream); - - // Turns a given hash record into a DBI record using the given symbol stream. - PDB_NO_DISCARD const CodeView::DBI::Record* GetRecord(const CoalescedMSFStream& symbolRecordStream, const HashRecord& hashRecord) const PDB_NO_EXCEPT; - - // Returns a view of all the records in the stream. - PDB_NO_DISCARD inline ArrayView GetRecords(void) const PDB_NO_EXCEPT - { - return ArrayView(m_hashRecords, m_count); - } - - private: - CoalescedMSFStream m_stream; - const HashRecord* m_hashRecords; - uint32_t m_count; - - PDB_DISABLE_COPY(PublicSymbolStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_RawFile.cpp b/third_party/raw_pdb/src/PDB_RawFile.cpp deleted file mode 100644 index f135efe..0000000 --- a/third_party/raw_pdb/src/PDB_RawFile.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_RawFile.h" -#include "PDB_Types.h" -#include "PDB_Util.h" -#include "PDB_DirectMSFStream.h" -#include "Foundation/PDB_PointerUtil.h" -#include "Foundation/PDB_Memory.h" -#include "Foundation/PDB_Assert.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::RawFile::RawFile(RawFile&& other) PDB_NO_EXCEPT - : m_data(PDB_MOVE(other.m_data)) - , m_superBlock(PDB_MOVE(other.m_superBlock)) - , m_directoryStream(PDB_MOVE(other.m_directoryStream)) - , m_streamCount(PDB_MOVE(other.m_streamCount)) - , m_streamSizes(PDB_MOVE(other.m_streamSizes)) - , m_streamBlocks(PDB_MOVE(other.m_streamBlocks)) -{ - other.m_data = nullptr; - other.m_superBlock = nullptr; - other.m_streamCount = 0u; - other.m_streamSizes = nullptr; - other.m_streamBlocks = nullptr; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::RawFile& PDB::RawFile::operator=(RawFile&& other) PDB_NO_EXCEPT -{ - if (this != &other) - { - PDB_DELETE_ARRAY(m_streamBlocks); - - m_data = PDB_MOVE(other.m_data); - m_superBlock = PDB_MOVE(other.m_superBlock); - m_directoryStream = PDB_MOVE(other.m_directoryStream); - m_streamCount = PDB_MOVE(other.m_streamCount); - m_streamSizes = PDB_MOVE(other.m_streamSizes); - m_streamBlocks = PDB_MOVE(other.m_streamBlocks); - - other.m_data = nullptr; - other.m_superBlock = nullptr; - other.m_streamCount = 0u; - other.m_streamSizes = nullptr; - other.m_streamBlocks = nullptr; - } - - return *this; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::RawFile::RawFile(const void* data) PDB_NO_EXCEPT - : m_data(data) - , m_superBlock(Pointer::Offset(data, 0u)) - , m_directoryStream() - , m_streamCount(0u) - , m_streamSizes(nullptr) - , m_streamBlocks(nullptr) -{ - // the SuperBlock stores an array of indices of blocks that make up the indices of directory blocks, which need to be stitched together to form the directory. - // the blocks holding the indices of directory blocks are not necessarily contiguous, so they need to be coalesced first. - const uint32_t directoryBlockCount = PDB::ConvertSizeToBlockCount(m_superBlock->directorySize, m_superBlock->blockSize); - - // the directory is made up of directoryBlockCount blocks, so we need that many indices to be read from the blocks that make up the indices - CoalescedMSFStream directoryIndicesStream(data, m_superBlock->blockSize, m_superBlock->directoryBlockIndices, directoryBlockCount * sizeof(uint32_t)); - - // these are the indices of blocks making up the directory stream, now guaranteed to be contiguous - const uint32_t* directoryIndices = directoryIndicesStream.GetDataAtOffset(0u); - - m_directoryStream = CoalescedMSFStream(data, m_superBlock->blockSize, directoryIndices, m_superBlock->directorySize); - - // https://llvm.org/docs/PDB/MsfFile.html#the-stream-directory - // parse the directory from its contiguous version. the directory matches the following struct: - // struct StreamDirectory - // { - // uint32_t streamCount; - // uint32_t streamSizes[streamCount]; - // uint32_t streamBlocks[streamCount][]; - // }; - m_streamCount = *m_directoryStream.GetDataAtOffset(0u); - - // we can assign pointers into the stream directly, since the RawFile keeps ownership of the directory stream - m_streamSizes = m_directoryStream.GetDataAtOffset(sizeof(uint32_t)); - const uint32_t* directoryStreamBlocks = m_directoryStream.GetDataAtOffset(sizeof(uint32_t) + sizeof(uint32_t) * m_streamCount); - - // prepare indices for directly accessing individual streams - m_streamBlocks = PDB_NEW_ARRAY(const uint32_t*, m_streamCount); - - const uint32_t* indicesForCurrentBlock = directoryStreamBlocks; - for (uint32_t i = 0u; i < m_streamCount; ++i) - { - const uint32_t sizeInBytes = GetStreamSize(i); - const uint32_t blockCount = ConvertSizeToBlockCount(sizeInBytes, m_superBlock->blockSize); - m_streamBlocks[i] = indicesForCurrentBlock; - - indicesForCurrentBlock += blockCount; - } -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::RawFile::~RawFile(void) PDB_NO_EXCEPT -{ - PDB_DELETE_ARRAY(m_streamBlocks); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -template -PDB_NO_DISCARD T PDB::RawFile::CreateMSFStream(uint32_t streamIndex) const PDB_NO_EXCEPT -{ - PDB_ASSERT(streamIndex != PDB::NilStreamIndex, "Invalid stream index."); - PDB_ASSERT(streamIndex < m_streamCount, "Invalid stream index."); - - return T(m_data, m_superBlock->blockSize, m_streamBlocks[streamIndex], GetStreamSize(streamIndex)); -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -template -PDB_NO_DISCARD T PDB::RawFile::CreateMSFStream(uint32_t streamIndex, uint32_t streamSize) const PDB_NO_EXCEPT -{ - PDB_ASSERT(streamIndex != PDB::NilStreamIndex, "Invalid stream index."); - PDB_ASSERT(streamIndex < m_streamCount, "Invalid stream index."); - PDB_ASSERT(streamSize <= GetStreamSize(streamIndex), "Invalid stream size."); - - return T(m_data, m_superBlock->blockSize, m_streamBlocks[streamIndex], streamSize); -} - - -// explicit template instantiation -template PDB::CoalescedMSFStream PDB::RawFile::CreateMSFStream(uint32_t streamIndex) const PDB_NO_EXCEPT; -template PDB::DirectMSFStream PDB::RawFile::CreateMSFStream(uint32_t streamIndex) const PDB_NO_EXCEPT; - -template PDB::CoalescedMSFStream PDB::RawFile::CreateMSFStream(uint32_t streamIndex, uint32_t streamSize) const PDB_NO_EXCEPT; -template PDB::DirectMSFStream PDB::RawFile::CreateMSFStream(uint32_t streamIndex, uint32_t streamSize) const PDB_NO_EXCEPT; diff --git a/third_party/raw_pdb/src/PDB_RawFile.h b/third_party/raw_pdb/src/PDB_RawFile.h deleted file mode 100644 index bf88673..0000000 --- a/third_party/raw_pdb/src/PDB_RawFile.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "PDB_CoalescedMSFStream.h" - - -// https://llvm.org/docs/PDB/index.html -namespace PDB -{ - struct SuperBlock; - - - class PDB_NO_DISCARD RawFile - { - public: - RawFile(RawFile&& other) PDB_NO_EXCEPT; - RawFile& operator=(RawFile&& other) PDB_NO_EXCEPT; - - explicit RawFile(const void* data) PDB_NO_EXCEPT; - ~RawFile(void) PDB_NO_EXCEPT; - - // Creates any type of MSF stream. - template - PDB_NO_DISCARD T CreateMSFStream(uint32_t streamIndex) const PDB_NO_EXCEPT; - - // Creates any type of MSF stream with the given size. - template - PDB_NO_DISCARD T CreateMSFStream(uint32_t streamIndex, uint32_t streamSize) const PDB_NO_EXCEPT; - - - // Returns the SuperBlock. - PDB_NO_DISCARD inline const SuperBlock* GetSuperBlock(void) const PDB_NO_EXCEPT - { - return m_superBlock; - } - - // Returns the number of streams in the PDB file. - PDB_NO_DISCARD inline uint32_t GetStreamCount(void) const PDB_NO_EXCEPT - { - return m_streamCount; - } - - // Returns the size of the stream with the given index, taking into account nil page sizes. - PDB_NO_DISCARD inline uint32_t GetStreamSize(uint32_t streamIndex) const PDB_NO_EXCEPT - { - const uint32_t streamSize = m_streamSizes[streamIndex]; - - return (streamSize == NilPageSize) ? 0u : streamSize; - } - - private: - const void* m_data; - const SuperBlock* m_superBlock; - CoalescedMSFStream m_directoryStream; - - // stream directory - uint32_t m_streamCount; - const uint32_t* m_streamSizes; - const uint32_t** m_streamBlocks; - - PDB_DISABLE_COPY(RawFile); - }; -} diff --git a/third_party/raw_pdb/src/PDB_SectionContributionStream.cpp b/third_party/raw_pdb/src/PDB_SectionContributionStream.cpp deleted file mode 100644 index a8a944e..0000000 --- a/third_party/raw_pdb/src/PDB_SectionContributionStream.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_SectionContributionStream.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::SectionContributionStream::SectionContributionStream(void) PDB_NO_EXCEPT - : m_stream() - , m_contributions(nullptr) - , m_count(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::SectionContributionStream::SectionContributionStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT - : m_stream(directStream, size, offset) - , m_contributions(m_stream.GetDataAtOffset(0u)) - , m_count(size / sizeof(DBI::SectionContribution)) -{ -} diff --git a/third_party/raw_pdb/src/PDB_SectionContributionStream.h b/third_party/raw_pdb/src/PDB_SectionContributionStream.h deleted file mode 100644 index c1a183d..0000000 --- a/third_party/raw_pdb/src/PDB_SectionContributionStream.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_DBITypes.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class PDB_NO_DISCARD DirectMSFStream; - - - class PDB_NO_DISCARD SectionContributionStream - { - public: - SectionContributionStream(void) PDB_NO_EXCEPT; - explicit SectionContributionStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(SectionContributionStream); - - // Returns a view of all section contributions in the stream. - PDB_NO_DISCARD inline ArrayView GetContributions(void) const PDB_NO_EXCEPT - { - return ArrayView(m_contributions, m_count); - } - - private: - CoalescedMSFStream m_stream; - const DBI::SectionContribution* m_contributions; - size_t m_count; - - PDB_DISABLE_COPY(SectionContributionStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_SourceFileStream.cpp b/third_party/raw_pdb/src/PDB_SourceFileStream.cpp deleted file mode 100644 index fc860f6..0000000 --- a/third_party/raw_pdb/src/PDB_SourceFileStream.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_SourceFileStream.h" - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::SourceFileStream::SourceFileStream(void) PDB_NO_EXCEPT - : m_stream() - , m_moduleCount(0u) - , m_moduleIndices(nullptr) - , m_moduleFileCounts(nullptr) - , m_fileNameOffsets(nullptr) - , m_stringTable(nullptr) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::SourceFileStream::SourceFileStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT - : m_stream(directStream, size, offset) - , m_moduleCount(0u) - , m_moduleIndices(nullptr) - , m_moduleFileCounts(nullptr) - , m_fileNameOffsets(nullptr) - , m_stringTable(nullptr) -{ - // we are going to consume the whole source info sub-stream, so create a coalesced stream for faster read operations and direct access. - // the sub-stream has the following layout: - // struct SourceInfoSubstream - // { - // uint16_t moduleCount; - // uint16_t sourceFileCount; - // uint16_t moduleIndices[moduleCount]; - // uint16_t moduleFileCounts[moduleCount]; - // uint32_t fileNameOffsets[realSourceFileCount]; - // char stringTable[][realSourceFileCount]; - // }; - m_moduleCount = *m_stream.GetDataAtOffset(0u); - size_t readOffset = sizeof(uint16_t); - - // skip number of source files. this would only support 64k unique files and is no longer used. - // the number of source files is computed dynamically instead. - readOffset += sizeof(uint16_t); - - // grab direct pointers into the stream data - m_moduleIndices = m_stream.GetDataAtOffset(readOffset); - readOffset += sizeof(uint16_t) * m_moduleCount; - - m_moduleFileCounts = m_stream.GetDataAtOffset(readOffset); - readOffset += sizeof(uint16_t) * m_moduleCount; - - // count the actual number of source files - size_t sourceFileCount = 0u; - for (unsigned int i = 0u; i < m_moduleCount; ++i) - { - sourceFileCount += m_moduleFileCounts[i]; - } - - m_fileNameOffsets = m_stream.GetDataAtOffset(readOffset); - readOffset += sizeof(uint32_t) * sourceFileCount; - - // grab a pointer into the string table - m_stringTable = m_stream.GetDataAtOffset(readOffset); -} diff --git a/third_party/raw_pdb/src/PDB_SourceFileStream.h b/third_party/raw_pdb/src/PDB_SourceFileStream.h deleted file mode 100644 index a32c4bd..0000000 --- a/third_party/raw_pdb/src/PDB_SourceFileStream.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_CoalescedMSFStream.h" - - -namespace PDB -{ - class PDB_NO_DISCARD DirectMSFStream; - - - class PDB_NO_DISCARD SourceFileStream - { - public: - SourceFileStream(void) PDB_NO_EXCEPT; - explicit SourceFileStream(const DirectMSFStream& directStream, uint32_t size, uint32_t offset) PDB_NO_EXCEPT; - - PDB_DEFAULT_MOVE(SourceFileStream); - - // Returns the number of modules. - PDB_NO_DISCARD inline uint32_t GetModuleCount(void) const PDB_NO_EXCEPT - { - return m_moduleCount; - } - - // Returns a view of all the filename offsets for the module with the given index. - PDB_NO_DISCARD inline ArrayView GetModuleFilenameOffsets(size_t moduleIndex) const PDB_NO_EXCEPT - { - const uint16_t moduleStartIndex = m_moduleIndices[moduleIndex]; - const uint16_t moduleFileCount = m_moduleFileCounts[moduleIndex]; - - return ArrayView(m_fileNameOffsets + moduleStartIndex, moduleFileCount); - } - - // Returns a filename for the given filename offset. - PDB_NO_DISCARD inline const char* GetFilename(uint32_t filenameOffset) const PDB_NO_EXCEPT - { - return m_stringTable + filenameOffset; - } - - private: - CoalescedMSFStream m_stream; - - // the number of modules - uint32_t m_moduleCount; - - // the indices into the file name offsets, for each module - const uint16_t* m_moduleIndices; - - // the number of files, for each module - const uint16_t* m_moduleFileCounts; - - // the filename offsets into the string table, for all modules - const uint32_t* m_fileNameOffsets; - - // the string table storing all filenames - const char* m_stringTable; - - PDB_DISABLE_COPY(SourceFileStream); - }; -} diff --git a/third_party/raw_pdb/src/PDB_TPIStream.cpp b/third_party/raw_pdb/src/PDB_TPIStream.cpp deleted file mode 100644 index 164195e..0000000 --- a/third_party/raw_pdb/src/PDB_TPIStream.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "PDB_PCH.h" -#include "PDB_TPIStream.h" -#include "PDB_RawFile.h" -#include "PDB_DirectMSFStream.h" -#include "Foundation/PDB_Memory.h" - -namespace -{ - // the TPI stream always resides at index 2 - static constexpr const uint32_t TPIStreamIndex = 2u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::TPIStream::TPIStream(void) PDB_NO_EXCEPT - : m_stream() - , m_header() - , m_recordCount(0u) -{ -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::TPIStream::TPIStream(TPIStream&& other) PDB_NO_EXCEPT - : m_stream(PDB_MOVE(other.m_stream)) - , m_header(PDB_MOVE(other.m_header)) - , m_recordCount(PDB_MOVE(other.m_recordCount)) -{ - other.m_recordCount = 0u; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::TPIStream& PDB::TPIStream::operator=(TPIStream&& other) PDB_NO_EXCEPT -{ - if (this != &other) - { - m_stream = PDB_MOVE(other.m_stream); - m_header = PDB_MOVE(other.m_header); - m_recordCount = PDB_MOVE(other.m_recordCount); - - other.m_recordCount = 0u; - } - - return *this; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB::TPIStream::TPIStream(const RawFile& file) PDB_NO_EXCEPT - : m_stream(file.CreateMSFStream(TPIStreamIndex)), - m_header(m_stream.ReadAtOffset(0u)), - m_recordCount(GetLastTypeIndex() - GetFirstTypeIndex()) -{ -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::ErrorCode PDB::HasValidTPIStream(const RawFile& file) PDB_NO_EXCEPT -{ - DirectMSFStream stream = file.CreateMSFStream(TPIStreamIndex); - if (stream.GetSize() < sizeof(TPI::StreamHeader)) - { - return ErrorCode::InvalidStream; - } - - const TPI::StreamHeader header = stream.ReadAtOffset(0u); - if (header.version != TPI::StreamHeader::Version::V80) - { - return ErrorCode::UnknownVersion; - } - - return ErrorCode::Success; -} - - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ -PDB_NO_DISCARD PDB::TPIStream PDB::CreateTPIStream(const RawFile& file) PDB_NO_EXCEPT -{ - return TPIStream { file }; -} diff --git a/third_party/raw_pdb/src/PDB_TPIStream.h b/third_party/raw_pdb/src/PDB_TPIStream.h deleted file mode 100644 index 81e9af0..0000000 --- a/third_party/raw_pdb/src/PDB_TPIStream.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_ArrayView.h" -#include "PDB_ErrorCodes.h" -#include "PDB_TPITypes.h" -#include "PDB_DirectMSFStream.h" -#include "PDB_Util.h" - -// PDB TPI stream -// https://llvm.org/docs/PDB/TpiStream.html -namespace PDB -{ - class RawFile; - - - class PDB_NO_DISCARD TPIStream - { - public: - TPIStream(void) PDB_NO_EXCEPT; - TPIStream(TPIStream&& other) PDB_NO_EXCEPT; - TPIStream& operator=(TPIStream&& other) PDB_NO_EXCEPT; - - explicit TPIStream(const RawFile& file) PDB_NO_EXCEPT; - - PDB_NO_DISCARD inline const DirectMSFStream& GetDirectMSFStream(void) const PDB_NO_EXCEPT - { - return m_stream; - } - - // Returns the index of the first type, which is not necessarily zero. - PDB_NO_DISCARD inline uint32_t GetFirstTypeIndex(void) const PDB_NO_EXCEPT - { - return m_header.typeIndexBegin; - } - - // Returns the index of the last type. - PDB_NO_DISCARD inline uint32_t GetLastTypeIndex(void) const PDB_NO_EXCEPT - { - return m_header.typeIndexEnd; - } - - // Returns the number of type records. - PDB_NO_DISCARD inline size_t GetTypeRecordCount(void) const PDB_NO_EXCEPT - { - return m_recordCount; - } - - CodeView::TPI::RecordHeader ReadTypeRecordHeader(size_t offset) const PDB_NO_EXCEPT - { - const CodeView::TPI::RecordHeader header = m_stream.ReadAtOffset(offset); - return header; - } - - template - void ForEachTypeRecordHeaderAndOffset(F&& functor) const PDB_NO_EXCEPT - { - // ignore the stream's header - size_t offset = sizeof(TPI::StreamHeader); - - while (offset < m_stream.GetSize()) - { - const CodeView::TPI::RecordHeader header = ReadTypeRecordHeader(offset); - - functor(header, offset); - - // position the stream offset at the next record - offset += sizeof(CodeView::TPI::RecordHeader) + header.size - sizeof(uint16_t); - } - } - - private: - DirectMSFStream m_stream; - TPI::StreamHeader m_header; - size_t m_recordCount; - - PDB_DISABLE_COPY(TPIStream); - }; - - // Returns whether the given raw file provides a valid TPI stream. - PDB_NO_DISCARD ErrorCode HasValidTPIStream(const RawFile& file) PDB_NO_EXCEPT; - - // Creates the TPI stream from a raw file. - PDB_NO_DISCARD TPIStream CreateTPIStream(const RawFile& file) PDB_NO_EXCEPT; -} diff --git a/third_party/raw_pdb/src/PDB_TPITypes.h b/third_party/raw_pdb/src/PDB_TPITypes.h deleted file mode 100644 index c12a5ed..0000000 --- a/third_party/raw_pdb/src/PDB_TPITypes.h +++ /dev/null @@ -1,867 +0,0 @@ -#pragma once - -#include "Foundation/PDB_Macros.h" -#include "Foundation/PDB_BitOperators.h" - -namespace PDB -{ - namespace TPI - { - // https://llvm.org/docs/PDB/TpiStream.html#stream-header - struct StreamHeader - { - enum class PDB_NO_DISCARD Version : uint32_t - { - V40 = 19950410u, - V41 = 19951122u, - V50 = 19961031u, - V70 = 19990903u, - V80 = 20040203u - }; - - Version version; - uint32_t headerSize; - uint32_t typeIndexBegin; - uint32_t typeIndexEnd; - uint32_t typeRecordBytes; - - uint16_t hashStreamIndex; - uint16_t hashAuxStreamIndex; - uint32_t hashKeySize; - uint32_t numHashBuckets; - - int32_t hashValueBufferOffset; - uint32_t hashValueBufferLength; - - int32_t indexOffsetBufferOffset; - uint32_t indexOffsetBufferLength; - - int32_t hashAdjBufferOffset; - uint32_t hashAdjBufferLength; - }; - } - - - namespace CodeView - { - namespace TPI - { - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L772 - enum class PDB_NO_DISCARD TypeRecordKind : uint16_t - { - LF_POINTER = 0x1002u, - LF_MODIFIER = 0x1001u, - LF_PROCEDURE = 0x1008u, - LF_MFUNCTION = 0x1009u, - LF_LABEL = 0x000eu, - LF_ARGLIST = 0x1201u, - LF_FIELDLIST = 0x1203u, - LF_VTSHAPE = 0x000au, - LF_BITFIELD = 0x1205u, - LF_METHODLIST = 0x1206u, - LF_ENDPRECOMP = 0x0014u, - - LF_BCLASS = 0x001400u, - LF_VBCLASS = 0x001401u, - LF_IVBCLASS = 0x001402u, - LF_FRIENDFCN_ST = 0x001403u, - LF_INDEX = 0x001404u, - LF_MEMBER_ST = 0x001405u, - LF_STMEMBER_ST = 0x001406u, - LF_METHOD_ST = 0x001407u, - LF_NESTTYPE_ST = 0x001408u, - LF_VFUNCTAB = 0x001409u, - LF_FRIENDCLS = 0x00140Au, - LF_ONEMETHOD_ST = 0x00140Bu, - LF_VFUNCOFF = 0x00140Cu, - LF_NESTTYPEEX_ST = 0x00140Du, - LF_MEMBERMODIFY_ST = 0x00140Eu, - LF_MANAGED_ST = 0x00140Fu, - - LF_SMAX = 0x001500u, - LF_TYPESERVER = 0x001501u, - LF_ENUMERATE = 0x001502u, - LF_ARRAY = 0x001503u, - LF_CLASS = 0x001504u, - LF_STRUCTURE = 0x001505u, - LF_UNION = 0x001506u, - LF_ENUM = 0x001507u, - LF_DIMARRAY = 0x001508u, - LF_PRECOMP = 0x001509u, - LF_ALIAS = 0x00150Au, - LF_DEFARG = 0x00150Bu, - LF_FRIENDFCN = 0x00150Cu, - LF_MEMBER = 0x00150Du, - LF_STMEMBER = 0x00150Eu, - LF_METHOD = 0x00150Fu, - LF_NESTTYPE = 0x001510u, - LF_ONEMETHOD = 0x001511u, - LF_NESTTYPEEX = 0x001512u, - LF_MEMBERMODIFY = 0x001513u, - LF_MANAGED = 0x001514u, - LF_TYPESERVER2 = 0x001515u, - LF_CLASS2 = 0x001608u, - LF_STRUCTURE2 = 0x001609u, - - LF_NUMERIC = 0x8000u, - LF_CHAR = 0x8000u, - LF_SHORT = 0x8001u, - LF_USHORT = 0x8002u, - LF_LONG = 0x8003u, - LF_ULONG = 0x8004u, - LF_REAL32 = 0x8005u, - LF_REAL64 = 0x8006u, - LF_REAL80 = 0x8007u, - LF_REAL128 = 0x8008u, - LF_QUADWORD = 0x8009u, - LF_UQUADWORD = 0x800au, - LF_REAL48 = 0x800bu, - LF_COMPLEX32 = 0x800cu, - LF_COMPLEX64 = 0x800du, - LF_COMPLEX80 = 0x800eu, - LF_COMPLEX128 = 0x800fu, - LF_VARSTRING = 0x8010u, - - LF_OCTWORD = 0x8017u, - LF_UOCTWORD = 0x8018u, - - LF_DECIMAL = 0x8019u, - LF_DATE = 0x801au, - LF_UTF8STRING = 0x801bu, - - LF_REAL16 = 0x801cu - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L328 - // https://github.com/ValveSoftware/wine/blob/cd165953c8b379a78418711f07417022e503c81b/include/wine/mscvpdb.h - enum class TypeIndexKind : uint16_t - { - T_NOTYPE = 0x0000u, // uncharacterized type (no type) - T_ABS = 0x0001u, // absolute symbol - T_SEGMENT = 0x0002u, // segment type - T_VOID = 0x0003u, // void - T_HRESULT = 0x0008u, // OLE/COM HRESULT - T_32PHRESULT = 0x0408u, // OLE/COM HRESULT __ptr32 * - T_64PHRESULT = 0x0608u, // OLE/COM HRESULT __ptr64 * - - // Emitted due to a compiler bug? - // 0x0600 bits appears to indicate a 64-bit pointer, but it has no type? - // Seen as type index for C11 "_Atomic uint32_t*" variable and constant. - T_UNKNOWN_0600 = 0x0600u, - - T_PVOID = 0x0103u, // near pointer to void - T_PFVOID = 0x0203u, // far pointer to void - T_PHVOID = 0x0303u, // huge pointer to void - T_32PVOID = 0x0403u, // 32 bit pointer to void - T_32PFVOID = 0x0503u, // 16:32 pointer to void - T_64PVOID = 0x0603u, // 64 bit pointer to void - T_CURRENCY = 0x0004u, // BASIC 8 byte currency value - T_NBASICSTR = 0x0005u, // Near BASIC string - T_FBASICSTR = 0x0006u, // Far BASIC string - T_NOTTRANS = 0x0007u, // type not translated by cvpack - T_BIT = 0x0060u, // bit - T_PASCHAR = 0x0061u, // Pascal CHAR - T_BOOL32FF = 0x0062u, // 32-bit BOOL where true is 0xffffffff - - T_CHAR = 0x0010u, // 8 bit signed - T_PCHAR = 0x0110u, // 16 bit pointer to 8 bit signed - T_PFCHAR = 0x0210u, // 16:16 far pointer to 8 bit signed - T_PHCHAR = 0x0310u, // 16:16 huge pointer to 8 bit signed - T_32PCHAR = 0x0410u, // 32 bit pointer to 8 bit signed - T_32PFCHAR = 0x0510u, // 16:32 pointer to 8 bit signed - T_64PCHAR = 0x0610u, // 64 bit pointer to 8 bit signed - - T_UCHAR = 0x0020u, // 8 bit unsigned - T_PUCHAR = 0x0120u, // 16 bit pointer to 8 bit unsigned - T_PFUCHAR = 0x0220u, // 16:16 far pointer to 8 bit unsigned - T_PHUCHAR = 0x0320u, // 16:16 huge pointer to 8 bit unsigned - T_32PUCHAR = 0x0420u, // 32 bit pointer to 8 bit unsigned - T_32PFUCHAR = 0x0520u, // 16:32 pointer to 8 bit unsigned - T_64PUCHAR = 0x0620u, // 64 bit pointer to 8 bit unsigned - - T_RCHAR = 0x0070u, // really a char - T_PRCHAR = 0x0170u, // 16 bit pointer to a real char - T_PFRCHAR = 0x0270u, // 16:16 far pointer to a real char - T_PHRCHAR = 0x0370u, // 16:16 huge pointer to a real char - T_32PRCHAR = 0x0470u, // 32 bit pointer to a real char - T_32PFRCHAR = 0x0570u, // 16:32 pointer to a real char - T_64PRCHAR = 0x0670u, // 64 bit pointer to a real char - - // wide character types - T_WCHAR = 0x0071u, // wide char - T_PWCHAR = 0x0171u, // 16 bit pointer to a wide char - T_PFWCHAR = 0x0271u, // 16:16 far pointer to a wide char - T_PHWCHAR = 0x0371u, // 16:16 huge pointer to a wide char - T_32PWCHAR = 0x0471u, // 32 bit pointer to a wide char - T_32PFWCHAR = 0x0571u, // 16:32 pointer to a wide char - T_64PWCHAR = 0x0671u, // 64 bit pointer to a wide char - - // 8-bit unicode char - T_CHAR8 = 0x007c, // 8-bit unicode char (C++ 20) - T_PCHAR8 = 0x017c, // Near pointer to 8-bit unicode char - T_PFCHAR8 = 0x027c, // Far pointer to 8-bit unicode char - T_PHCHAR8 = 0x037c, // Huge pointer to 8-bit unicode char - T_32PCHAR8 = 0x047c, // 16:32 near pointer to 8-bit unicode char - T_32PFCHAR8 = 0x057c, // 16:32 far pointer to 8-bit unicode char - T_64PCHAR8 = 0x067c, // 64 bit near pointer to 8-bit unicode char - - // 16-bit unicode char - T_CHAR16 = 0x007au, // 16-bit unicode char - T_PCHAR16 = 0x017au, // 16 bit pointer to a 16-bit unicode char - T_PFCHAR16 = 0x027au, // 16:16 far pointer to a 16-bit unicode char - T_PHCHAR16 = 0x037au, // 16:16 huge pointer to a 16-bit unicode char - T_32PCHAR16 = 0x047au, // 32 bit pointer to a 16-bit unicode char - T_32PFCHAR16 = 0x057au, // 16:32 pointer to a 16-bit unicode char - T_64PCHAR16 = 0x067au, // 64 bit pointer to a 16-bit unicode char - - // 32-bit unicode char - T_CHAR32 = 0x007bu, // 32-bit unicode char - T_PCHAR32 = 0x017bu, // 16 bit pointer to a 32-bit unicode char - T_PFCHAR32 = 0x027bu, // 16:16 far pointer to a 32-bit unicode char - T_PHCHAR32 = 0x037bu, // 16:16 huge pointer to a 32-bit unicode char - T_32PCHAR32 = 0x047bu, // 32 bit pointer to a 32-bit unicode char - T_32PFCHAR32 = 0x057bu, // 16:32 pointer to a 32-bit unicode char - T_64PCHAR32 = 0x067bu, // 64 bit pointer to a 32-bit unicode char - - // 8 bit int types - T_INT1 = 0x0068u, // 8 bit signed int - T_PINT1 = 0x0168u, // 16 bit pointer to 8 bit signed int - T_PFINT1 = 0x0268u, // 16:16 far pointer to 8 bit signed int - T_PHINT1 = 0x0368u, // 16:16 huge pointer to 8 bit signed int - T_32PINT1 = 0x0468u, // 32 bit pointer to 8 bit signed int - T_32PFINT1 = 0x0568u, // 16:32 pointer to 8 bit signed int - T_64PINT1 = 0x0668u, // 64 bit pointer to 8 bit signed int - - T_UINT1 = 0x0069u, // 8 bit unsigned int - T_PUINT1 = 0x0169u, // 16 bit pointer to 8 bit unsigned int - T_PFUINT1 = 0x0269u, // 16:16 far pointer to 8 bit unsigned int - T_PHUINT1 = 0x0369u, // 16:16 huge pointer to 8 bit unsigned int - T_32PUINT1 = 0x0469u, // 32 bit pointer to 8 bit unsigned int - T_32PFUINT1 = 0x0569u, // 16:32 pointer to 8 bit unsigned int - T_64PUINT1 = 0x0669u, // 64 bit pointer to 8 bit unsigned int - - // 16 bit short types - T_SHORT = 0x0011u, // 16 bit signed - T_PSHORT = 0x0111u, // 16 bit pointer to 16 bit signed - T_PFSHORT = 0x0211u, // 16:16 far pointer to 16 bit signed - T_PHSHORT = 0x0311u, // 16:16 huge pointer to 16 bit signed - T_32PSHORT = 0x0411u, // 32 bit pointer to 16 bit signed - T_32PFSHORT = 0x0511u, // 16:32 pointer to 16 bit signed - T_64PSHORT = 0x0611u, // 64 bit pointer to 16 bit signed - - T_USHORT = 0x0021u, - T_PUSHORT = 0x0121u, - T_PFUSHORT = 0x0221u, - T_PHUSHORT = 0x0321u, - T_32PUSHORT = 0x0421u, - T_32PFUSHORT = 0x0521u, - T_64PUSHORT = 0x0621u, - - T_INT2 = 0x0072u, - T_PINT2 = 0x0172u, - T_PFINT2 = 0x0272u, - T_PHINT2 = 0x0372u, - T_32PINT2 = 0x0472u, - T_32PFINT2 = 0x0572u, - T_64PINT2 = 0x0672u, - - T_UINT2 = 0x0073u, - T_PUINT2 = 0x0173u, - T_PFUINT2 = 0x0273u, - T_PHUINT2 = 0x0373u, - T_32PUINT2 = 0x0473u, - T_32PFUINT2 = 0x0573u, - T_64PUINT2 = 0x0673u, - - T_LONG = 0x0012u, - T_PLONG = 0x0112u, - T_PFLONG = 0x0212u, - T_PHLONG = 0x0312u, - T_32PLONG = 0x0412u, - T_32PFLONG = 0x0512u, - T_64PLONG = 0x0612u, - - T_ULONG = 0x0022u, - T_PULONG = 0x0122u, - T_PFULONG = 0x0222u, - T_PHULONG = 0x0322u, - T_32PULONG = 0x0422u, - T_32PFULONG = 0x0522u, - T_64PULONG = 0x0622u, - - T_INT4 = 0x0074u, - T_PINT4 = 0x0174u, - T_PFINT4 = 0x0274u, - T_PHINT4 = 0x0374u, - T_32PINT4 = 0x0474u, - T_32PFINT4 = 0x0574u, - T_64PINT4 = 0x0674u, - - T_UINT4 = 0x0075u, - T_PUINT4 = 0x0175u, - T_PFUINT4 = 0x0275u, - T_PHUINT4 = 0x0375u, - T_32PUINT4 = 0x0475u, - T_32PFUINT4 = 0x0575u, - T_64PUINT4 = 0x0675u, - - T_QUAD = 0x0013u, - T_PQUAD = 0x0113u, - T_PFQUAD = 0x0213u, - T_PHQUAD = 0x0313u, - T_32PQUAD = 0x0413u, - T_32PFQUAD = 0x0513u, - T_64PQUAD = 0x0613u, - - T_UQUAD = 0x0023u, - T_PUQUAD = 0x0123u, - T_PFUQUAD = 0x0223u, - T_PHUQUAD = 0x0323u, - T_32PUQUAD = 0x0423u, - T_32PFUQUAD = 0x0523u, - T_64PUQUAD = 0x0623u, - - T_INT8 = 0x0076u, - T_PINT8 = 0x0176u, - T_PFINT8 = 0x0276u, - T_PHINT8 = 0x0376u, - T_32PINT8 = 0x0476u, - T_32PFINT8 = 0x0576u, - T_64PINT8 = 0x0676u, - - T_UINT8 = 0x0077u, - T_PUINT8 = 0x0177u, - T_PFUINT8 = 0x0277u, - T_PHUINT8 = 0x0377u, - T_32PUINT8 = 0x0477u, - T_32PFUINT8 = 0x0577u, - T_64PUINT8 = 0x0677u, - - T_OCT = 0x0014u, - T_POCT = 0x0114u, - T_PFOCT = 0x0214u, - T_PHOCT = 0x0314u, - T_32POCT = 0x0414u, - T_32PFOCT = 0x0514u, - T_64POCT = 0x0614u, - - T_UOCT = 0x0024u, - T_PUOCT = 0x0124u, - T_PFUOCT = 0x0224u, - T_PHUOCT = 0x0324u, - T_32PUOCT = 0x0424u, - T_32PFUOCT = 0x0524u, - T_64PUOCT = 0x0624u, - - T_INT16 = 0x0078u, - T_PINT16 = 0x0178u, - T_PFINT16 = 0x0278u, - T_PHINT16 = 0x0378u, - T_32PINT16 = 0x0478u, - T_32PFINT16 = 0x0578u, - T_64PINT16 = 0x0678u, - - T_UINT16 = 0x0079u, - T_PUINT16 = 0x0179u, - T_PFUINT16 = 0x0279u, - T_PHUINT16 = 0x0379u, - T_32PUINT16 = 0x0479u, - T_32PFUINT16 = 0x0579u, - T_64PUINT16 = 0x0679u, - - T_REAL32 = 0x0040u, - T_PREAL32 = 0x0140u, - T_PFREAL32 = 0x0240u, - T_PHREAL32 = 0x0340u, - T_32PREAL32 = 0x0440u, - T_32PFREAL32 = 0x0540u, - T_64PREAL32 = 0x0640u, - - T_REAL48 = 0x0044u, - T_PREAL48 = 0x0144u, - T_PFREAL48 = 0x0244u, - T_PHREAL48 = 0x0344u, - T_32PREAL48 = 0x0444u, - T_32PFREAL48 = 0x0544u, - T_64PREAL48 = 0x0644u, - - T_REAL64 = 0x0041u, - T_PREAL64 = 0x0141u, - T_PFREAL64 = 0x0241u, - T_PHREAL64 = 0x0341u, - T_32PREAL64 = 0x0441u, - T_32PFREAL64 = 0x0541u, - T_64PREAL64 = 0x0641u, - - T_REAL80 = 0x0042u, - T_PREAL80 = 0x0142u, - T_PFREAL80 = 0x0242u, - T_PHREAL80 = 0x0342u, - T_32PREAL80 = 0x0442u, - T_32PFREAL80 = 0x0542u, - T_64PREAL80 = 0x0642u, - - T_REAL128 = 0x0043u, - T_PREAL128 = 0x0143u, - T_PFREAL128 = 0x0243u, - T_PHREAL128 = 0x0343u, - T_32PREAL128 = 0x0443u, - T_32PFREAL128 = 0x0543u, - T_64PREAL128 = 0x0643u, - - T_CPLX32 = 0x0050u, - T_PCPLX32 = 0x0150u, - T_PFCPLX32 = 0x0250u, - T_PHCPLX32 = 0x0350u, - T_32PCPLX32 = 0x0450u, - T_32PFCPLX32 = 0x0550u, - T_64PCPLX32 = 0x0650u, - - T_CPLX64 = 0x0051u, - T_PCPLX64 = 0x0151u, - T_PFCPLX64 = 0x0251u, - T_PHCPLX64 = 0x0351u, - T_32PCPLX64 = 0x0451u, - T_32PFCPLX64 = 0x0551u, - T_64PCPLX64 = 0x0651u, - - T_CPLX80 = 0x0052u, - T_PCPLX80 = 0x0152u, - T_PFCPLX80 = 0x0252u, - T_PHCPLX80 = 0x0352u, - T_32PCPLX80 = 0x0452u, - T_32PFCPLX80 = 0x0552u, - T_64PCPLX80 = 0x0652u, - - T_CPLX128 = 0x0053u, - T_PCPLX128 = 0x0153u, - T_PFCPLX128 = 0x0253u, - T_PHCPLX128 = 0x0353u, - T_32PCPLX128 = 0x0453u, - T_32PFCPLX128 = 0x0553u, - T_64PCPLX128 = 0x0653u, - - T_BOOL08 = 0x0030u, - T_PBOOL08 = 0x0130u, - T_PFBOOL08 = 0x0230u, - T_PHBOOL08 = 0x0330u, - T_32PBOOL08 = 0x0430u, - T_32PFBOOL08 = 0x0530u, - T_64PBOOL08 = 0x0630u, - - T_BOOL16 = 0x0031u, - T_PBOOL16 = 0x0131u, - T_PFBOOL16 = 0x0231u, - T_PHBOOL16 = 0x0331u, - T_32PBOOL16 = 0x0431u, - T_32PFBOOL16 = 0x0531u, - T_64PBOOL16 = 0x0631u, - - T_BOOL32 = 0x0032u, - T_PBOOL32 = 0x0132u, - T_PFBOOL32 = 0x0232u, - T_PHBOOL32 = 0x0332u, - T_32PBOOL32 = 0x0432u, - T_32PFBOOL32 = 0x0532u, - T_64PBOOL32 = 0x0632u, - - T_BOOL64 = 0x0033u, - T_PBOOL64 = 0x0133u, - T_PFBOOL64 = 0x0233u, - T_PHBOOL64 = 0x0333u, - T_32PBOOL64 = 0x0433u, - T_32PFBOOL64 = 0x0533u, - T_64PBOOL64 = 0x0633u, - - T_NCVPTR = 0x01F0u, - T_FCVPTR = 0x02F0u, - T_HCVPTR = 0x03F0u, - T_32NCVPTR = 0x04F0u, - T_32FCVPTR = 0x05F0u, - T_64NCVPTR = 0x06F0u - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvconst.h#L31 - enum class CallingConvention : uint8_t - { - NEAR_C = 0x00u, // near right to left pushu, caller pops stack - FAR_C = 0x01u, // far right to left pushu, caller pops stack - NEAR_PASCAL = 0x02u,// near left to right pushu, callee pops stack - FAR_PASCAL = 0x03u, // far left to right pushu, callee pops stack - NEAR_FAST = 0x04u, // near left to right push with regsu, callee pops stack - FAR_FAST = 0x05u, // far left to right push with regsu, callee pops stack - SKIPPED = 0x06u, // skipped (unused) call index - NEAR_STD = 0x07u, // near standard call - FAR_STD = 0x08u, // far standard call - NEAR_SYS = 0x09u, // near sys call - FAR_SYS = 0x0au, // far sys call - THISCALL = 0x0bu, // this call (this passed in register) - MIPSCALL = 0x0cu, // Mips call - GENERIC = 0x0du, // Generic call sequence - ALPHACALL = 0x0eu, // Alpha call - PPCCALL = 0x0fu, // PPC call - SHCALL = 0x10u, // Hitachi SuperH call - ARMCALL = 0x11u, // ARM call - AM33CALL = 0x12u, // AM33 call - TRICALL = 0x13u, // TriCore Call - SH5CALL = 0x14u, // Hitachi SuperH-5 call - M32RCALL = 0x15u, // M32R Call - CLRCALL = 0x16u, // clr call - INLINE = 0x17u, // Marker for routines always inlined and thus lacking a convention - NEAR_VECTOR = 0x18u,// near left to right push with regsu, callee pops stack - RESERVED = 0x19u // first unused call enumeration - - // Do NOT add any more machine specific conventions. This is to be used for - // calling conventions in the source only (e.g. __cdeclu, __stdcall). - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1049 - enum class MethodProperty : uint8_t - { - Vanilla = 0x00u, - Virtual = 0x01u, - Static = 0x02u, - Friend = 0x03u, - Intro = 0x04u, - PureVirt = 0x05u, - PureIntro = 0x06u - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1120 - struct TypeProperty - { - uint16_t packed : 1; // true if structure is packed - uint16_t ctor : 1; // true if constructors or destructors present - uint16_t ovlops : 1; // true if overloaded operators present - uint16_t isnested : 1; // true if this is a nested class - uint16_t cnested : 1; // true if this class contains nested types - uint16_t opassign : 1; // true if overloaded assignment (=) - uint16_t opcast : 1; // true if casting methods - uint16_t fwdref : 1; // true if forward reference (incomplete defn) - uint16_t scoped : 1; // scoped definition - uint16_t hasuniquename : 1; // true if there is a decorated name following the regular name - uint16_t sealed : 1; // true if class cannot be used as a base class - uint16_t hfa : 2; // CV_HFA_e - uint16_t intrinsic : 1; // true if class is an intrinsic type (e.g. __m128d) - uint16_t mocom : 2; // CV_MOCOM_UDe - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1142 - struct MemberAttributes - { - uint16_t access : 2; // access protection CV_access_t - uint16_t mprop : 3; // method properties CV_methodprop_t - uint16_t pseudo : 1; // compiler generated fcn and does not exist - uint16_t noinherit : 1; // true if class cannot be inherited - uint16_t noconstruct : 1; // true if class cannot be constructed - uint16_t compgenx : 1; // compiler generated fcn and does exist - uint16_t sealed : 1; // true if method cannot be overridden - uint16_t unused : 6; // unused - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1156 - struct FunctionAttributes - { - uint8_t cxxreturnudt : 1; // true if C++ style ReturnUDT - uint8_t ctor : 1; // true if func is an instance constructor - uint8_t ctorvbase : 1; // true if func is an instance constructor of a class with virtual bases - uint8_t unused : 5; // unused - }; - - struct RecordHeader - { - uint16_t size; // record length, not including this 2-byte field - TypeRecordKind kind; // record kind - }; - - struct LeafEasy - { - TypeRecordKind kind; // record kind - }; - - struct FieldList - { - TypeRecordKind kind; // record kind - union Data - { -#pragma pack(push, 1) - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2499 - struct - { - MemberAttributes attributes; // method attribute - uint32_t index; // type index of base class - union - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, offset); // variable length offset of base within class - LeafEasy lfEasy; - }; - }LF_BCLASS; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2521 - struct - { - MemberAttributes attributes; // attribute - uint32_t index; // type index of direct virtual base class - uint32_t vbpIndex; // type index of virtual base pointer - PDB_FLEXIBLE_ARRAY_MEMBER(char, vbpOffset); // virtual base pointer offset from address point - } LF_VBCLASS, LF_IVBCLASS; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2483 - // index leaf - contains type index of another leaf - // a major use of this leaf is to allow the compilers to emit a - // long complex list (LF_FIELD) in smaller pieces. - struct - { - uint16_t pad0; // internal padding, must be 0 - uint32_t type; // type index of referenced leaf - } LF_INDEX; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2615 - struct - { - uint16_t pad0; // internal padding, must be 0. - uint32_t type; // type index of pointer - }LF_VFUNCTAB; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2683 - struct - { - MemberAttributes attributes; - union - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, value); - LeafEasy lfEasy; - }; - } LF_ENUMERATE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2693 - struct - { - uint16_t pad0; // internal padding, must be 0 - uint32_t index; // index of nested type definition - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - }LF_NESTTYPE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2650 - struct - { - uint16_t count; // number of occurrences of function - uint32_t mList; // index to LF_METHODLIST record - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - }LF_METHOD; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2671 - struct - { - MemberAttributes attributes; // method attribute - uint32_t index; // index to type record for procedure - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, vbaseoff); // offset in vfunctable if - }LF_ONEMETHOD; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2580 - struct - { - MemberAttributes attributes; - uint32_t index; // type index of referenced leaf - union - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, offset); - LeafEasy lfEasy; - }; - } LF_MEMBER; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2592 - struct - { - MemberAttributes attributes; - uint32_t index; // index of type record for field - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - }LF_STMEMBER; -#pragma pack(pop) - } data; - }; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2131 - struct MethodListEntry - { - MemberAttributes attributes; // method attribute - uint16_t pad0; // internal padding, must be 0 - uint32_t index; // index to type record for procedure - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, vbaseoff); // offset in vfunctable if virtual, empty otherwise. - }; - - // all CodeView records are stored as a header, followed by variable-length data. - // internal Record structs such as S_PUB32, S_GDATA32, etc. correspond to the data layout of a CodeView record of that kind. - struct Record - { - RecordHeader header; - union Data - { -#pragma pack(push, 1) - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2144 - struct - { - // This is actually a list of the MethodListEntry type above, but it has flexible - // size, so you need to manually iterate. - PDB_FLEXIBLE_ARRAY_MEMBER(char, mList); - } LF_METHODLIST; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1801 - struct - { - uint32_t rvtype; // type index of return value - uint32_t classtype; // type index of containing class - uint32_t thistype; // type index of this pointer (model specific) - uint8_t calltype; // calling convention (call_t) - FunctionAttributes funcattr; // attributes - uint16_t parmcount; // number of parameters - uint32_t arglist; // type index of argument list - int32_t thisadjust; // this adjuster (long because pad required anyway) - } LF_MFUNCTION; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1460 - struct - { - uint32_t type; // modified type - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1090 - struct - { - uint16_t MOD_const : 1; - uint16_t MOD_volatile : 1; - uint16_t MOD_unaligned : 1; - uint16_t MOD_unused : 13; - } attr; // modifier attribute modifier_t - } LF_MODIFIER; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1508 - struct - { - uint32_t utype; // type index of the underlying type - struct PointerAttributes - { - uint32_t ptrtype : 5; // ordinal specifying pointer type (CV_ptrtype_e) - uint32_t ptrmode : 3; // ordinal specifying pointer mode (CV_ptrmode_e) - uint32_t isflat32 : 1; // TRUE if 0:32 pointer - uint32_t isvolatile : 1; // TRUE if volatile pointer - uint32_t isconst : 1; // TRUE if const pointer - uint32_t isunaligned : 1; // TRUE if unaligned pointer - uint32_t isrestrict : 1; // TRUE if restricted pointer (allow agressive opts) - uint32_t size : 6; // size of pointer (in bytes) - uint32_t ismocom : 1; // TRUE if it is a MoCOM pointer (^ or %) - uint32_t islref : 1; // TRUE if it is this pointer of member function with & ref-qualifier - uint32_t isrref : 1; // TRUE if it is this pointer of member function with && ref-qualifier - uint32_t unused : 10; // pad out to 32-bits for following cv_typ_t's - } attr; - - union - { - struct - { - uint32_t pmclass; // index of containing class for pointer to member - uint16_t pmenum; // enumeration specifying pm format (CV_pmtype_e) - } pm; - - uint16_t bseg; // base segment if PTR_BASE_SEG - PDB_FLEXIBLE_ARRAY_MEMBER(uint8_t, Sym); // copy of base symbol record (including length) - - struct - { - uint32_t index; // type index if CV_PTR_BASE_TYPE - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); // name of base type - } btype; - } pbase; - } LF_POINTER; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1775 - struct - { - uint32_t rvtype; // type index of return value - CallingConvention calltype; // calling convention (CV_call_t) - FunctionAttributes funcattr; // attributes - uint16_t parmcount; // number of parameters - uint32_t arglist; // type index of argument list - } LF_PROCEDURE; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2043 - struct - { - uint32_t count; // number of arguments - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, arg); - } LF_ARGLIST; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2164 - struct - { - uint32_t type; - uint8_t length; - uint8_t position; - PDB_FLEXIBLE_ARRAY_MEMBER(char, data); - } LF_BITFIELD; - - struct - { - uint32_t elemtype; // type index of element type - uint32_t idxtype; // type index of indexing type - PDB_FLEXIBLE_ARRAY_MEMBER(char, data); // variable length data specifying size in bytes and name - } LF_ARRAY; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1631 - struct - { - uint16_t count; // count of number of elements in class - TypeProperty property; // property attribute field - uint32_t field; // type index of LF_FIELD descriptor list - uint32_t derived; // type index of derived from list if not zero - uint32_t vshape; // type index of vshape table for this class - union - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, data); - LeafEasy lfEasy; - }; - } LF_CLASS; - - struct - { - uint16_t count; // count of number of elements in class - uint32_t property; // property attribute field - uint32_t field; // type index of LF_FIELD descriptor list - uint32_t derived; // type index of derived from list if not zero - uint32_t vshape; // type index of vshape table for this class - union - { - PDB_FLEXIBLE_ARRAY_MEMBER(char, data); - LeafEasy lfEasy; - }; - } LF_CLASS2; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1647 - struct - { - uint16_t count; // count of number of elements in class - TypeProperty property; // property attribute field - uint32_t field; // type index of LF_FIELD descriptor list - PDB_FLEXIBLE_ARRAY_MEMBER(char, data); - } LF_UNION; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L1752 - struct - { - uint16_t count; // count of number of elements in class - TypeProperty property; // property attribute field - uint32_t utype; // underlying type of the enum - uint32_t field; // type index of LF_FIELD descriptor list - PDB_FLEXIBLE_ARRAY_MEMBER(char, name); - } LF_ENUM; - - // https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h#L2112 - struct - { - FieldList list; - } LF_FIELD; -#pragma pack(pop) - } data; - }; - } - } -} diff --git a/third_party/raw_pdb/src/PDB_Types.cpp b/third_party/raw_pdb/src/PDB_Types.cpp deleted file mode 100644 index 66c5cea..0000000 --- a/third_party/raw_pdb/src/PDB_Types.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#include "PDB_PCH.h" -#include "PDB_Types.h" - - -// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L962 -const char PDB::SuperBlock::MAGIC[30u] = "Microsoft C/C++ MSF 7.00\r\n\x1a\x44\x53"; - -const uint32_t PDB::HashTableHeader::Signature = 0xffffffffu; -const uint32_t PDB::HashTableHeader::Version = 0xeffe0000u + 19990810u; diff --git a/third_party/raw_pdb/src/PDB_Types.h b/third_party/raw_pdb/src/PDB_Types.h deleted file mode 100644 index 39945fc..0000000 --- a/third_party/raw_pdb/src/PDB_Types.h +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" - - -namespace PDB -{ - // emulating std::byte from C++17 to make the intention clear that we're dealing with untyped data in certain cases, without actually requiring C++17 - enum class Byte : unsigned char {}; - - // PDB files have the notion of "nil" pages, denoted by a special size - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L177 - const uint32_t NilPageSize = 0xffffffffu; - - // PDB files have the notion of a "nil" stream index - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/msf.h#L45 - const uint16_t NilStreamIndex = 0xffffu; - - // this matches the definition in guiddef.h, but we don't want to pull that in - struct GUID - { - uint32_t Data1; - uint16_t Data2; - uint16_t Data3; - uint8_t Data4[8]; - }; - - static_assert(sizeof(GUID) == 16u, "Size mismatch."); - - // this matches the definition in winnt.h, but we don't want to pull that in - struct IMAGE_SECTION_HEADER - { - uint8_t Name[8]; - union - { - uint32_t PhysicalAddress; - uint32_t VirtualSize; - } Misc; - uint32_t VirtualAddress; - uint32_t SizeOfRawData; - uint32_t PointerToRawData; - uint32_t PointerToRelocations; - uint32_t PointerToLinenumbers; - uint16_t NumberOfRelocations; - uint16_t NumberOfLinenumbers; - uint32_t Characteristics; - }; - - static_assert(sizeof(IMAGE_SECTION_HEADER) == 40u, "Size mismatch."); - - // https://llvm.org/docs/PDB/MsfFile.html#msf-superblock - struct PDB_NO_DISCARD SuperBlock - { - static const char MAGIC[30u]; - - char fileMagic[30u]; - char padding[2u]; - uint32_t blockSize; - uint32_t freeBlockMapIndex; // index of the free block map - uint32_t blockCount; // number of blocks in the file - uint32_t directorySize; // size of the stream directory in bytes - uint32_t unknown; - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, directoryBlockIndices); // indices of the blocks that make up the directory indices - }; - - // https://llvm.org/docs/PDB/PdbStream.html#stream-header - struct Header - { - enum class PDB_NO_DISCARD Version : uint32_t - { - VC2 = 19941610u, - VC4 = 19950623u, - VC41 = 19950814u, - VC50 = 19960307u, - VC98 = 19970604u, - VC70Dep = 19990604u, - VC70 = 20000404u, - VC80 = 20030901u, - VC110 = 20091201u, - VC140 = 20140508u - }; - - Version version; - uint32_t signature; - uint32_t age; - GUID guid; - }; - - // https://llvm.org/docs/PDB/PdbStream.html - struct NamedStreamMap - { - uint32_t length; - PDB_FLEXIBLE_ARRAY_MEMBER(char, stringTable); - - struct HashTableEntry - { - uint32_t stringTableOffset; - uint32_t streamIndex; - }; - }; - - // https://llvm.org/docs/PDB/HashTable.html - struct SerializedHashTable - { - struct Header - { - uint32_t size; - uint32_t capacity; - }; - - struct BitVector - { - uint32_t wordCount; - PDB_FLEXIBLE_ARRAY_MEMBER(uint32_t, words); - }; - }; - - // https://llvm.org/docs/PDB/PdbStream.html#pdb-feature-codes - enum class PDB_NO_DISCARD FeatureCode : uint32_t - { - VC110 = 20091201, - VC140 = 20140508, - - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/pdbcommon.h#L23 - NoTypeMerge = 0x4D544F4E, // "NOTM" - MinimalDebugInfo = 0x494E494D // "MINI", i.e. executable was linked with /DEBUG:FASTLINK - }; - - // header of the public stream, based on PSGSIHDR defined here: - // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h#L240 - struct PublicStreamHeader - { - uint32_t symHash; - uint32_t addrMap; - uint32_t thunkCount; - uint32_t sizeOfThunk; - uint16_t isectThunkTable; - uint16_t padding; - uint32_t offsetThunkTable; - uint16_t sectionCount; - uint16_t padding2; - }; - - // header of the hash tables used by the public and global symbol stream, based on GSIHashHdr defined here: - // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h#L62 - struct HashTableHeader - { - static const uint32_t Signature; - static const uint32_t Version; - - uint32_t signature; - uint32_t version; - uint32_t size; - uint32_t bucketCount; - }; - - // hash record, based on HRFile defined here: - // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h#L8 - struct HashRecord - { - uint32_t offset; // offset into the symbol record stream - uint32_t cref; - }; -} diff --git a/third_party/raw_pdb/src/PDB_Util.h b/third_party/raw_pdb/src/PDB_Util.h deleted file mode 100644 index c722659..0000000 --- a/third_party/raw_pdb/src/PDB_Util.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2011-2022, Molecular Matters GmbH -// See LICENSE.txt for licensing details (2-clause BSD License: https://opensource.org/licenses/BSD-2-Clause) - -#pragma once - -#include "Foundation/PDB_Macros.h" - - -namespace PDB -{ - // Converts a block index into a file offset, based on the block size of the PDB file - PDB_NO_DISCARD inline size_t ConvertBlockIndexToFileOffset(uint32_t blockIndex, uint32_t blockSize) PDB_NO_EXCEPT - { - // cast to size_t to avoid potential overflow in 64-bit - return static_cast(blockIndex) * static_cast(blockSize); - } - - // Calculates how many blocks are needed for a certain number of bytes - PDB_NO_DISCARD inline uint32_t ConvertSizeToBlockCount(uint32_t sizeInBytes, uint32_t blockSize) PDB_NO_EXCEPT - { - // integer ceil to account for non-full blocks - return static_cast((static_cast(sizeInBytes) + blockSize - 1u) / blockSize); - }; - - // Returns the actual size of the data associated with a CodeView record, not including the size of the header - template - PDB_NO_DISCARD inline uint32_t GetCodeViewRecordSize(const T* record) PDB_NO_EXCEPT - { - // the stored size includes the size of the 'kind' field, but not the size of the 'size' field itself - return record->header.size - sizeof(uint16_t); - } - - template - PDB_NO_DISCARD inline size_t GetNameLength(const Header& header, const T& record) PDB_NO_EXCEPT - { - // we can estimate the length of the string from the size of the record - const size_t estimatedLength = header.size - sizeof(uint16_t) - sizeof(T); - if (estimatedLength == 0u) - { - return estimatedLength; - } - - // we still need to account for padding after the string to find the real length - size_t nullTerminatorCount = 0u; - for (/* nothing */; nullTerminatorCount < estimatedLength; ++nullTerminatorCount) - { - if (record.name[estimatedLength - nullTerminatorCount - 1u] != '\0') - { - break; - } - } - - const size_t length = estimatedLength - nullTerminatorCount; - return length; - } -}